Typescript: исключение всех необходимых свойств из типа - PullRequest
2 голосов
/ 25 марта 2019

Как мне определить следующий код типа ExcludeAllRequiredProps<T>, чтобы исключить (как следует из названия) все необходимые свойства?Заранее спасибо.

type A = {
  a: number,
  b: number,
  c?: number,
  d?: number
}

type B = ExcludeAllRequiredProps<A>


// B shall be { c?: number, d?: number }

[Изменить - через некоторое время]

Считаете ли вы это правильным решением?

type ExcludeAllRequiredProps<T> = {
  [K in keyof T]?: T extends Record<K, T[K]> ? never : T[K]
}

1 Ответ

1 голос
/ 25 марта 2019

Ваше решение близко, но оно сохраняет эти дополнительные ключи, которые могут вызвать путаницу, даже если они имеют тип never. Это решение удалит ненужные ключи из результата:

type ExcludeAllRequiredProps<T> = Pick<T, {
    [K in keyof T]-?: T extends Record<K, T[K]> ? never : K
}[keyof T]>

type A = {
    a: number,
    b: number,
    c?: number,
    d?: number
}

type B = ExcludeAllRequiredProps<A> // { c?: number, d?: number }
...