在 TypeScript 中,
Partial<T>
是一个内置的工具类型,用于将给定类型T
中的所有属性转换为可选属性。
1. 示例
ts
type Person = {
name: string;
age: number;
address: string;
};
type PartialPerson = Partial<Person>;
/*
PartialPerson 的类型为:
{
name?: string | undefined;
age?: number | undefined;
address?: string | undefined;
}
*/
在上面的示例中,Partial<Person>
将类型 Person
中的所有属性转换为可选属性,添加了 ?
符号。
这样,PartialPerson
类型中的每个属性都可以是该属性的类型或者 undefined
。
2. 过程
下面是一个手动实现 Partial<T>
的示例:
ts
type Partial<T> = {
[P in keyof T]?: T[P];
};
在上面的示例中,我们使用了映射类型来遍历类型 T
中的每个属性,并将其转换为可选属性。
[P in keyof T]
表示遍历 T
类型中的每个属性,并使用索引签名 P
来表示属性名。
然后,通过添加 ?
符号将属性转换为可选属性,并使用类型 T[P]
来表示属性的类型。
2.1 keyof
在 TypeScript 中,
keyof
是一个用于获取类型中所有属性名称的操作符。 它返回一个由类型中所有属性键组成的联合类型。
ts
type Person = {
name: string;
age: number;
address: string;
};
type PersonKeys = keyof Person; // 类型为 "name" | "age" | "address"
// `PersonKeys` 类型是 `Person` 类型中所有属性的联合类型。
// 这意味着 `PersonKeys` 只能是 `"name"`、`"age"` 或 `"address"` 这三个字符串字面量类型中的一个。
2.2 测试
ts
(() => {
type Foo = {
a: string;
b: number;
c: boolean;
};
type MyPartial<T> = {
[P in keyof T]?: T[P];
};
const a: MyPartial<Foo> = {};
const b: MyPartial<Foo> = {
a: "BFE.dev",
};
const c: MyPartial<Foo> = {
b: 123,
};
const d: MyPartial<Foo> = {
b: 123,
c: true,
};
const e: MyPartial<Foo> = {
a: "BFE.dev",
b: 123,
c: true,
};
})();