Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 如何递归地从类型中省略键_Typescript_Recursion_Types - Fatal编程技术网

Typescript 如何递归地从类型中省略键

Typescript 如何递归地从类型中省略键,typescript,recursion,types,Typescript,Recursion,Types,我想写一个递归省略字段的类型实用程序。 您将命名和使用的东西,如递归地省略 我曾尝试使用映射类型+条件类型来实现这一点,但我坚持使用所有必需字段都正确键入的情况(因此字段从嵌套类型中消失),但使用这种方法可以忽略可选字段 // This is for one function that removes recursively __typename field // that Appolo client adds type Deapolify<T extends { __typename:

我想写一个递归省略字段的类型实用程序。 您将命名和使用的东西,如递归地省略

我曾尝试使用映射类型+条件类型来实现这一点,但我坚持使用所有必需字段都正确键入的情况(因此字段从嵌套类型中消失),但使用这种方法可以忽略可选字段

// This is for one function that removes recursively __typename field 
// that Appolo client adds
type Deapolify<T extends { __typename: string }> = Omit<
  { [P in keyof T]: T[P] extends { __typename: string } ? Deapolify<T[P]> : T[P] },
  '__typename'
>

// Or more generic attempt

type OmitRecursively<T extends any, K extends keyof T> = Omit<
  { [P in keyof T]: T[P] extends any ? Omit<T[P], K> : never },
  K
>
//这是一个递归删除类型名字段的函数
//这名Appolo客户补充道
类型depolify=省略<
{[P in keyof T]:T[P]扩展了{uuu typename:string}?去极化:T[P]},
“uu typename”
>
//或更一般的尝试
递归地键入ommit=ommit<
{[P in keyof T]:T[P]扩展了any?省略:never},
K
>
预期的行为将是root,所有嵌套键的类型都应该递归省略。 例如

A型={
keyToKeep:字符串
keyToOmit:字符串
嵌套的:{
keyToKeep:字符串
keyToOmit:字符串
}
NestedoOptional?:{
keyToKeep:字符串
keyToOmit:字符串
}
}
类型Result=递归省略
所需类型={
keyToKeep:字符串
嵌套的:{
keyToKeep:字符串
}
NestedoOptional?:{
keyToKeep:字符串
}
} 
预期===结果

您不会递归调用
省略
,而且我也只会在属性类型为对象时递归应用省略,否则它应该主要起作用:


type OmitDistributive<T, K extends PropertyKey> = T extends any ? (T extends object ? Id<OmitRecursively<T, K>> : T) : never;
type Id<T> = {} & { [P in keyof T] : T[P]} // Cosmetic use only makes the tooltips expad the type can be removed 
type OmitRecursively<T extends any, K extends PropertyKey> = Omit<
    { [P in keyof T]: OmitDistributive<T[P], K> },
    K
>

type A = {
    keyToKeep: string
    keyToOmit: string
    nested: {
        keyToKeep: string
        keyToOmit: string
    }
    nestedOptional?: {
        keyToKeep: string
        keyToOmit: string
    }
}

type Result = OmitRecursively<A, 'keyToOmit'>

它不起作用。我一秒钟前刚检查过那个代码。它能以某种方式连接到编译器配置吗?@AndriiLos工作了几年,严格的空checsk导致的问题将在一段时间内解决second@AndriiLos修复了使用严格的空检查的问题,作为一个副作用,它还将深入到联合中,并从每个联合成员中删除属性(在我看来这可能是一件好事)。它起作用了!问题是。你能一步一步地详细解释一下吗?因为我完全不懂省略和其他:)还有,为什么你使用不同的省略而不是TS烘焙的原始省略?@AndriiLos编辑了答案,希望能更清楚一点
OmitDistributive<{ a: number, b: number} | undefined}, 'a'> = 
     OmitRecursively<{ a: number, b: number}, 'a'> | undefined