属性选择、约束

一个属性对象中选出一些对象, 使用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 }

 

 

 

 

  

posted @ 2025-02-21 15:17  我是格鲁特  阅读(10)  评论(0)    收藏  举报