typescript - Typescript Conditional Types 结合映射类型文档示例说明
问题描述
我试图了解 TypeScript 2.8 中引入的条件类型并阅读相同的文档。
下面的例子可以在下面的链接中看到 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html
该部分中有一个示例:
- 分布式条件类型
- 条件类型在与映射类型结合使用时特别有用:
type FunctionPropertyNames<T> = { [K in keyof T]: T[K] extends Function ? K : never }[keyof T];
我了解
{ [K in keyof T]: T[K] extends Function ? K : never }
它选择功能类型的所有键的部分。但我不明白为什么最后有一个数组类型的语法
[keyof T]
它在那里做什么?为什么需要它?
提前致谢。
解决方案
它被称为查找类型
使用数组访问语法,我们可以获得传入的所有属性类型的联合。
({ a: string, b: number, c: object })['a' | 'b'] // -> string | number
让我们看一个例子,其中 T 是:
{
a: () => void,
b: () => void,
c: string
}
的预期结果FunctionPropertyNames<T>
是'a' | 'b'
。
映射类型产生如下对象类型:
{
a: 'a',
b: 'b',
c: never
}
但这不是我们想要的,我们需要属性名称作为联合类型。这就是查找类型的用武之地。
在示例中,我们T
基本上使用了所有键:
({ a: 'a', b: 'b', c: never })['a' | 'b' | 'c'] // -> 'a' | 'b' | never
这会返回'a' | 'b' | never
并且never
无关紧要,因此 TypeScript 将其删除,我们得到'a' | 'b'
推荐阅读
- node.js - 部署后:带有 Office365 和 SSLv3 的节点 IMAP MailListener 错误:140059098205512:error:1408F10B:SSL
- r - 如何根据其他变量中的值为每个人创建二进制变量?
- python - 计算每个 K-means 集群的数据点
- autodesk-forge - IFC 的 Translation 属性是什么意思?
- opencv - 有没有办法知道没有立体校正的视差是否为负?
- apache-spark - Mesos 实现
- consul - 当 consul 节点在服务器模式下运行时,/v1/agent/services 将返回哪个端点?
- python - 将 str 拆分为 int 然后变成字典
- sorting - 无法在 ARM 中对数组进行排序。已排序,但有数字缺失和重复
- amazon-web-services - ECS Windows Optimized AMI 启用 IAM 任务角色