TypeScript 条件排除类型从接口中排除

2024-06-24

根据文档,我可以使用预定义的排除类型从某些类型中排除某些属性:

type Test = string | number | (() => void);

type T02 = Exclude<Test, Function>;

但是,如果我没有测试类型而是测试接口,它似乎不起作用。在下面的情况下如何才能获得类似的结果?

interface Test {
  a: string;
  b: number;
  c: () => void;
} 

// get somehow interface with excluded function properties??

要获得这种效果,您需要找出哪些属性匹配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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TypeScript 条件排除类型从接口中排除 的相关文章

随机推荐