要获得这种效果,您需要找出与Function 匹配的属性,然后有选择地排除它们。等效地,我们找到哪些属性与Function 不匹配,然后选择性地包含它们。这比仅仅排除工会的某些部分涉及更多;它涉及mapped types以及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。
如果T 是Test 并且V 是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"]
,或
"a" | "b" | never
,或
"a" | "b"
一旦我们有了这些键,我们就从T Pick 获取它们的属性(使用Pick<T, K> utility type):
Pick<Test, "a" | "b">
变成想要的类型
{
a: string,
b: number
}
好的,希望对您有所帮助;祝你好运!
Link to code