要获得这种效果,您需要找出哪些属性匹配Function
,然后选择性地排除它们。同样,我们找到哪些属性不匹配Function
,然后有选择地包含它们。这比仅仅排除工会的某些部分更为复杂。它涉及映射类型 https://www.typescriptlang.org/docs/handbook/advanced-types.html#mapped-types也条件类型 https://github.com/Microsoft/TypeScript/wiki/What's-new-in-TypeScript#conditional-types.
一种方法如下:
type ExcludeMatchingProperties<T, V> = Pick<
T,
{ [K in keyof T]-?: T[K] extends V ? never : K }[keyof T]
>;
type T02 = ExcludeMatchingProperties<Test, Function>;
// type T02 = {
// a: string;
// b: number;
// }
正在检查ExcludeMatchingProperties<T, V>
,我们可以注意到类型{ [K in keyof T]-?: T[K] extends V ? never : K }[keyof T]
将返回密钥T
其属性不可分配给V
.
If T
is Test
and V
is Function
,这变得像
{
a: string extends Function ? never : "a";
b: number extends Function ? never : "b";
c: ()=>void extends Function ? never : "c"
}["a"|"b"|"c"]
,这变成
{ a: "a"; b: "b"; c: never }["a"|"b"|"c"]
,这变成
{ a: "a"; b: "b"; c: never }["a"] |
{ a: "a"; b: "b"; c: never }["b"] |
{ a: "a"; b: "b"; c: never }["c"]
, or
"a" | "b" | never
, or
"a" | "b"
一旦我们有了这些钥匙,我们Pick
他们的财产来自T
(使用Pick<T, K>
实用型 https://www.typescriptlang.org/docs/handbook/utility-types.html#picktk):
Pick<Test, "a" | "b">
这将成为所需的类型
{
a: string,
b: number
}
好的,希望有帮助;祝你好运!
链接到代码 https://www.typescriptlang.org/play/#code/JYOwLgpgTgZghgYwgAgCoQM5mQbwFDLJwBcyWUoA5gNwHIBGpIArgLb3S2EKkAUAlMgC8APmQA3APbAAJrQC+ePGACeABxQBRAB4IANsxkQAsnDAIAFlQAKUSRqhhgmADyoANMgBqYocmvACADWLnQedDjIANoA0sigyEEQKpIwaAC6ALQA-KSosenIENqQIDIY3sjZyCAQ4tDIpHHyUUkpaajpeCK0yuooqAAMAEzCyDr6hiZmljZ2Dk6u6FieAGLMIAhOkiA9eAD0+8iqGmgjY-iHRKTkVLRXjDVsHFD3R4pAA