typescript - 澄清索引类型查询运算符和扩展关键字

标签 typescript

我正在阅读有关 Typescript 中高级类型的文档(可在此处找到:https://www.typescriptlang.org/docs/handbook/advanced-types.html),它提到了索引查询运算符并给出了以下示例:

function pluck<T, K extends keyof T>(o: T, names: K[]): T[K][] {
  return names.map(n => o[n]);
}

我了解 keyof 如何生成对象 T 上所有已知公共(public)属性名称的联合,但我不完全了解 extends 的作用> 播放。我知道这是说 K 必须是 T 的有效属性,但为什么使用 extends 而不是其他东西?此外,是否可以在 Typescript 中扩展联合,或者这更多是泛型特有的语义?

谢谢。

最佳答案

在此上下文中,关键字 extends 是一种对类型参数添加约束的方法。

给出这个简单的例子,你会看到编译器只允许你传入符合Person接口(interface)的对象:

interface Person {
    name: string;
}

function logAndReturnPerson<T extends Person>(person: T) {
    console.log(person.name);
    return person;
}

// ok
const result1 = logAndReturnPerson<Person>({ name: "David" });
// not ok, string does not satisfy constraint of Person
const result2 = logAndReturnPerson<string>("");

在您的示例中,K extends keyof T 表示 K 被限制为 keyof T。换句话说,这意味着您的想法——K 是一个字符串,它被限制为 T 的属性名称。

是的,这是泛型特有的语义。请注意,可以在约束中使用联合类型。

关于typescript - 澄清索引类型查询运算符和扩展关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46438142/

相关文章:

reactjs - 如何设置react-router-dom的类型?

javascript - 如果与大小写不匹配,则搜索不会返回数组元素

javascript - 在 react-table 的第 2+ 页上传递给子组件的 Prop 不正确

arrays - 属性在类型上不存在/不能用作索引类型

visual-studio - Visual Studio 2013 和部署 Typescript Html 模板

angular - 等待 observable 完成

typescript - 类型 'payload' 上不存在属性 'Actions'

javascript - 为什么 typescript 类中的这种结构在编译正常时会导致运行时错误?

typescript - 带有 typescript 自​​定义命令的 Cypress 类型错误

javascript - 在接口(interface)上定义索引类型的选择