Skip to main content

59 - 获得可选属性

Answer TestCases

实现高级工具类型 GetOptional<T>,该类型保留所有可选属性

例如

type I = GetOptional<{ foo: number; bar?: string }> // expected to be { bar?: string }

Solution

type GetOptional<T> = {
[P in keyof T as T[P] extends Required<T>[P] ? never : P]: T[P]
}

原理类似于 57 题

看成两部分

(P in keyof T) as (T[P] extends Required<T>[P] ? never : P)

T 等于 { foo: number; bar?: string }

keyof T 等于 'foo' | 'bar', 此时会遍历该联合类型

P'foo', 得到 'foo' as (number extends number ? 'never' : 'foo'), 返回 never

P'bar', 得到 'bar' as ((string | undefined) extends string ? never : 'bar') 返回 bar

never 时忽略,为 'bar' 时 返回 bar: T['bar'], 即 bar?: string