属性选择、约束
一个属性对象中选出一些对象, 使用Pick<T, K>
type Person = { name: string; age: number; address: string; }; type PickedPerson = Pick<Person, 'name' | 'age'>; const person: PickedPerson = { name: 'Alice', age: 25, // address: 'USA' // ❌ 报错:address 不在 PickedPerson 中 };
如果想去掉某些属性,使用 Omit<T, K>
type WithoutAddress = Omit<Person, 'address'>; // 等同于 { name: string; age: number }
让 T
的所有属性变成可选,使用Partial<T>
type Person = { name: string; age: number; address: string; }; type PartialPerson = Partial<Person>; const person: PartialPerson = { name: "Alice", // 只填一部分属性也不会报错 };
想让传入的函数参数 必须是某个对象的 key
,可以使用 keyof
关键字
type Person = { name: string; age: number; address: string; }; function printKey(key: keyof Person) { console.log("Key:", key); } printKey("name"); // ✅ 正确 printKey("age"); // ✅ 正确 printKey("address"); // ✅ 正确 // printKey("email"); // ❌ 报错:"email" 不是 Person 的 key
范型约束版本:
K extends keyof T
确保 key
只能是 T
的属性名,否则会报错
function getValue<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key]; } const person = { name: "Alice", age: 25 }; console.log(getValue(person, "name")); // ✅ "Alice" console.log(getValue(person, "age")); // ✅ 25 // console.log(getValue(person, "email")); // ❌ 报错:"email" 不是 `person` 的 key
对象中的属性必须来自于另一个对象的Key
type PickProperties<T, K extends keyof T> = { [P in K]: T[P]; }; type Person = { name: string; age: number; address: string; }; type PartialPerson = PickProperties<Person, "name" | "age">; // 等同于:{ name: string; age: number }