Вывод литерального типа - 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");
Другие вопросы по тегам