📜  typescript 接口键与另一种类型 - TypeScript (1)

📅  最后修改于: 2023-12-03 15:20:43.339000             🧑  作者: Mango

TypeScript 接口键与另一种类型

在 TypeScript 中,接口是一种非常实用的编程工具,可以用来描述对象的形状和应该具备的属性和方法。虽然接口通常被描述为键-值对的列表,但实际上可以与 TypeScript 中的另一种类型进行组合,以实现更复杂的类型定义。

与联合类型结合使用

在 TypeScript 中,可以将接口键组合到其他类型定义中。例如,可以将字符串和数字的联合类型与接口键一起使用,以创建包含具有特定属性的字符串和数字属性的对象:

interface Name {
  firstName: string;
  lastName: string;
}

type NameOrAge = Name | { age: number };

function getPersonDetails(details: NameOrAge) {
  if ("firstName" in details) {
    console.log(`Name: ${details.firstName} ${details.lastName}`);
  } else {
    console.log(`Age: ${details.age}`);
  }
}

在上面的代码中,NameOrAge 是一个联合类型,可以表示一个具有 firstNamelastName 属性的名称对象或一个具有 age 属性的数字对象。通过 in 关键字,可以检查对象是否具有指定的属性。因此,如果输入的 details 参数具有 firstNamelastName 属性,则会输出该人的姓名,否则会输出他们的年龄。

与类型推断结合使用

另一方面,可以将接口键与类型推断一起使用,以更精确地定义函数的返回类型。例如,可以使用 keyof 关键字来获取接口的所有键,并使用 Record 类型来将它们映射到其对应的值类型:

interface Animal {
  name: string;
  species: string;
  weight: number;
}

function getAnimalProperty<K extends keyof Animal>(animal: Animal, property: K): Animal[K] {
  return animal[property];
}

const myAnimal: Animal = { name: "Toby", species: "Dog", weight: 42 };
const animalName = getAnimalProperty(myAnimal, "name"); // animalName 的类型为 string

在上面的代码中,getAnimalProperty 函数接受一个 Animal 对象和一个 property 参数,后者应该是 Animal 接口中的一个键。通过将 K 设置为 keyof Animal,可以使 TypeScript 知道 property 的类型必须是接口的某个键。然后,使用 Animal[K] 作为返回类型,这将使 TypeScript 确定返回值的类型与指定键的类型相对应。

总结

将 TypeScript 中的接口键与其他类型结合使用,可以实现更复杂的类型定义。通过联合类型和类型推断,可以将接口的优势与 TypeScript 的其他功能结合起来,使代码更加易于理解和维护。