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

时间:2019-08-06 22:25:39

标签: typescript typescript-typings

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

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

type T02 = Exclude<Test, Function>;

但是,如果我不是Test类型,而是要具有Test接口,那么它似乎不起作用。在以下情况下如何获得相似的结果?

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

// get somehow interface with excluded function properties??

1 个答案:

答案 0 :(得分:1)

要获得这种效果,您需要确定哪些属性与output { s3 { region => "us-east-1" bucket => "my_bucket" size_file => 10000 restore => true prefix => "my_folder/" codec => "json_lines" } } 相匹配,然后有选择地排除它们。等效地,我们找到哪些属性与Function不匹配,然后有选择地包括它们。这不仅涉及排除工会的某些部分,还涉及更多的工作。它涉及mapped typesconditional types

执行此操作的一种方法如下:

Function

在检查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的键。

如果VT,而TestV,则类似于

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" Pick(使用T utility typePick<T, K>的属性:

Pick<Test, "a" | "b">

这将成为所需的类型

{
  a: string,
  b: number
}

好的,希望能有所帮助;祝你好运!

Link to code