根据文档,我可以使用预定义的“排除”类型从某些类型中排除某些属性:
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??
答案 0 :(得分:1)
要获得这种效果,您需要确定哪些属性与output {
s3 {
region => "us-east-1"
bucket => "my_bucket"
size_file => 10000
restore => true
prefix => "my_folder/"
codec => "json_lines"
}
}
相匹配,然后有选择地排除它们。等效地,我们找到哪些属性与Function
不匹配,然后有选择地包括它们。这不仅涉及排除工会的某些部分,还涉及更多的工作。它涉及mapped types和conditional 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
的键。
如果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"
Pick
(使用T
utility type)Pick<T, K>
的属性:
Pick<Test, "a" | "b">
这将成为所需的类型
{
a: string,
b: number
}
好的,希望能有所帮助;祝你好运!