如何解决带有点符号的打字稿深度省略
由于 TypeScript 现在支持模板字面量类型,是否可以使用以下内容?
interface Data {
a: number;
b: {
c: number;
d: number;
}
}
type OmitDeep<T,K> = ...
type WithoutC = OmitDeep<Data,'b.c'>
其中 WithoutC
将被推断为:
interface WithoutC {
a: number;
b: {
d: number
}
}
解决方法
您可以使用此类型将虚线路径映射到数组路径:
type UnDot<T extends string> =
T extends `${infer A}.${infer B}` ? [A,B] : ''
type ProperyArray = UnDot<'a.b'>; // ["a","b"]
然后使用此答案删除嵌套属性:
Types for deleting object at specific nested path
编辑任意数量的嵌套级别:
type UnDot<T extends string> =
T extends `${infer A}.${infer B}`
? [A,...UnDot<B>]
: [T];
,
除了罗伯托的精彩回答,完整的解决方案看起来像这样:
type Tail<T extends any[]> = ((...t: T) => void) extends ((
h: any,...r: infer R
) => void)
? R
: never;
type DeepOmit<T,Path extends string[]> = T extends object ?
Path['length'] extends 1 ? Omit<T,Path[0]> : {
[K in keyof T]: K extends Path[0] ? DeepOmit<T[K],Tail<Path>> : T[K];
} : T;
type UnDot<T extends string> =
T extends `${infer A}.${infer B}`
? [A,...UnDot<B>]
: [T];
type Nested = {
a: number;
b: {
c: number;
d: number;
}
};
type Omitted = DeepOmit<Nested,UnDot<'b.c'>>
const foo: Omitted = {a: 1,b: { c: 1,d: 2 } }; // error
~~~~
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。