Вывод литерального типа - Typescript
Учитывая это определение:
interface Domain<Model, Name extends string> {
name: Name;
edit(cb: (m: Model) => Model): Domain<Model, Name>;
}
declare function createDomain<
M extends { [key: string]: any } = {},
N extends string = string
>(name: N): Domain<M, N>;
IDE может дать вам правильный осмотр (как показано на рисунке): это потому, что машинопись может выводить
'foo'
как буквальный тип, который extends N /* string */
,
но
если я предоставлю подпись для общего M
затем машинопись теряет информацию о 'foo'
и возвращает общий string
,
Как я могу изменить приведенное выше определение, чтобы сохранить информацию о N
?
1 ответ
Я вижу эти варианты:
Укажите второй тип
let domain = createDomain<Todo, "foo">("foo");
Построить завод
function funcCreateDomain<M>() {
return <N extends string>(name: N) => createDomain<M, N>(name);
}
let factory = funcCreateDomain<Todo>();
let domain = factory("foo");