typescript - [keyof T] 在类型定义中的右大括号之后是什么意思?
问题描述
查看此 URL https://www.typescriptlang.org/docs/handbook/advanced-types.html上的 Typescript 文档
type FunctionPropertyNames<T> = {
[K in keyof T]: T[K] extends Function ? K : never;
}[keyof T];
有人可以向我解释一下右括号后的 [keyof T] 是什么意思吗?这种语法有任何文档吗?
解决方案
这就是所谓的“查找类型”。
keyof X
返回一个类型的所有键如果
interface a {
foo: never
bar: string
baz: number
}
那么type not_here = a['foo']
将是never
但是查找类型也支持传入keyof Something
,所以
a[keyof a]
将是所有类型的a
s 键/属性的联合,即never | string | number
. 虽然never
那里没有任何意义,所以 TS 会自动忽略它,导致string | number
.
(当然可以a[keyof b]
,这里没有限制)
我发现找出像这样的复杂类型的最佳方法是像我在这里所做的那样按步骤分解它们:
interface test {
a: string
b: () => void
c: () => void
}
type T_A<T> = {
[K in keyof T]: T[K]
};
type T_B<T> = {
[K in keyof T]: T[K] extends Function ? K : never;
};
type T_C<T> = {
[K in keyof T]: T[K] extends Function ? K : never;
}[keyof T];
type a = T_A<test>
type b = T_B<test>
type c = T_C<test>
有了这个,您可以看到为获得所需结果所采取的各个步骤,即“函数类型的键的联合”。
推荐阅读
- swift - 在视图中滑动手指以读出单个组件 - Swift
- r - 如何简洁地制作这个过程?(
- ios - 如何从我的应用打开指向我的应用的动态链接
- django - drf 壮观未在 swagger ui 中显示查询参数
- contentful - 如何使用 ruby on rails 仅使用 url insted 的 entry-id 获取内容条目?
- java - 令牌“{”上的语法错误,在此令牌切换 (char) 之后需要 SwitchLabels
- amazon-web-services - 如果运行的底层 Powershell 脚本失败,如何使 Ansible 任务失败?
- c# - 不正确的警告将 null 文字或可能的 null 值转换为不可为 null 的类型
- reactjs - 在 rooks 中使用 useDebounce 时如何设置加载为真?
- javascript - 为什么这个 getter 方法在 React 中被调用了多次?