Сопоставленные типы: удаление дополнительного модификатора

учитывая этот код:

interface Foo{
  one?: string;
  two?: string;
}

type Foo2 = {
  [P in keyof Foo]: number;
}

Я ожидал бы тип Foo2 на { one: number; two: number; } однако вместо этого он, похоже, сохраняет дополнительный модификатор { one?: number; two?: number; }

можно ли удалить дополнительный модификатор при использовании сопоставлены типы?

1 ответов


в Typescript 2.8 вы можете явно исключить модификатор:

type Foo2 = {
  [P in keyof Foo]-?: number;
}

Если вы используете старую версию, вы можете использовать этот метод:

type Helper<T, TNames extends string> = { [P in TNames]: (T & { [name: string]: never })[P] };
type Foo3 = Helper<Foo, keyof Foo>;