lon*_*556 2 typescript typescript3.0
最简单的例子
假设这种类型
type Foo = { a: number } | { b: string } | { c: boolean };
Run Code Online (Sandbox Code Playgroud)
是否有可能得到
type KeysOfFoo = 'a' | 'b' | 'c';
Run Code Online (Sandbox Code Playgroud)
我试过了,但没用
type Failed = keyof Foo; // never
Run Code Online (Sandbox Code Playgroud)
类似的东西只会产生肯定位于 类型的对象上keyof (A | B | C)的键,这意味着它必须是已知位于所有、和中的键,即:。即,是“逆变”。但这不是您想要的(在您的情况下,没有共同的键,因此交集是)。A | B | CABCkeyof A & keyof B & keyof Ckeyof TTnever
如果您正在查找至少一个联合成员中的一组键,则需要将运算符分配keyof给联合成员。幸运的是,有一种方法可以通过分布式条件类型来做到这一点。它看起来像这样:
type AllKeys<T> = T extends any ? keyof T : never;
Run Code Online (Sandbox Code Playgroud)
T extends any在类型检查方面并没有做太多的事情,但它确实向编译器发出信号,表明每个联合成员的操作应该T分别发生T,然后结果将重新组合成一个联合。这意味着AllKeys<A | B | C>将被视为AllKeys<A> | AllKeys<B> | AllKeys<C>。我们来尝试一下:
type KeysOfFoo = AllKeys<Foo>;
// type KeysOfFoo = "a" | "b" | "c"
Run Code Online (Sandbox Code Playgroud)
看起来不错!KeysOfFoo请注意,实际与 类型的对象一起使用时应该小心Foo。keyof是逆变的,原因是:
function hmm(foo: Foo, k: AllKeys<Foo>) {
foo[k]; // error!
// "a" | "b" | "c"' can't be used to index type 'Foo'.
// Property 'a' does not exist on type 'Foo'
}
Run Code Online (Sandbox Code Playgroud)
由于无法安全地索引foowithk类型的值,因此对{a: number}with进行索引是不安全的"b"......对象上可能不存在该键。显然,您比我更了解您的用例,因此您很可能对AllKeys<Foo>和进行了一些合法的使用Foo。我只是说要小心。
| 归档时间: |
|
| 查看次数: |
948 次 |
| 最近记录: |