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

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

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

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

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

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


person NSjonas    schedule 04.04.2018    source источник


Ответы (3)


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

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

Или используйте тип Required, встроенный в более новые версии.

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

type Helper<T, TNames extends string> = { [P in TNames]: (T & { [name: string]: never })[P] };
type Foo3 = Helper<Foo, keyof Foo>;
person Titian Cernicova-Dragomir    schedule 04.04.2018
comment
Откуда ты об этом узнал? Я не могу найти его в документации. Я видел подобное с -readonly и пытаюсь узнать об этом больше - person tamj0rd2; 30.10.2020
comment
@ tamj0rd2 Из PR, который их добавил github.com/Microsoft/TypeScript/pull/21919 - person Titian Cernicova-Dragomir; 30.10.2020

Вы можете использовать Required<T> как альтернативу -?

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

type Foo2 = {
  [P in keyof Required<Foo>]: number;
};
person iarroyo    schedule 23.10.2018

Я бы, наверное, построил свою Утилиту

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

type RequiredWithType<T, V> = {
  [P in keyof T]-?: V;
}

// and then just use it
type Foo2 = RequiredWithType<Foo, Number>;

Я написал здесь статью среднего размера о сопоставленных типах, которые Вы можете найти интересное :)

person Jose Greinch    schedule 01.01.2021