题目描述
Implement the type version of Object.entries
For example
interface Model {
name: string;
age: number;
locations: string[] | null;
}
type modelEntries = ObjectEntries<Model> // ['name', string] | ['age', number] | ['locations', string[] | null];
题解
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'
interface Model {
name: string
age: number
locations: string[] | null
}
type ModelEntries = ['name', string] | ['age', number] | ['locations', string[] | null]
type cases = [
Expect<Equal<ObjectEntries<Model>, ModelEntries>>,
Expect<Equal<ObjectEntries<Partial<Model>>, ModelEntries>>,
Expect<Equal<ObjectEntries<{ key?: undefined }>, ['key', undefined]>>,
Expect<Equal<ObjectEntries<{ key: undefined }>, ['key', undefined]>>,
Expect<Equal<ObjectEntries<{ key: string | undefined }>, ['key', string | undefined]>>,
]
// ============= Your Code Here =============
type ObjectEntries<
T,
P = keyof T
> =
P extends keyof T
? [P, Required<T>[P] extends [never]
? undefined
: Required<T>[P]]
: undefined;
条件类型
type ObjectEntries<
T,
P = keyof T
> =
P extends keyof T
? [P, Required<T>[P] extends [never]
? undefined
: Required<T>[P]]
: undefined;
-
泛型参数:
-
T
:目标对象 -
P = keyof T
:默认为T
的所有键,用于分布式条件判断
-
-
条件类型:
-
P extends keyof T
:-
如果
P
是T
的键:-
[P, Required<T>[P] extends [never] ? undefined : Required<T>[P]]
-
元组类型:将键
P
和值Required<T>[P]
组合成元组 -
处理
never
类型:-
Required<T>[P]
:通过Required
去除值的可选性,确保值类型为非可选类型 -
extends [never] ? undefined
:如果去除可选性后的值类型为never
,则用undefined
替代,否则保留原值类型
-
-
-
-
如果
P
不是T
的键,返回undefined
-
-