typescript - 在打字稿界面键迭代中使用条件类型
问题描述
嗨有2个接口和一个类型
interface A {
k1: string
k2: string
}
interface B {
k3: string
k4: A
}
type Error = { key:string, value:string}
我开发了一个声明,它使用给定接口的所有键创建一个接口,并且type = Error[]
type AutoErrors<P> = {
[K in keyof P]-?: Error[]
}
这很好用,因为AutoErrors<A>
给
{
k1: Error[]
k2: Error[]
}
但是现在我希望它是递归的,即如果参数类型键不是字符串类型,我希望它的类型是AutoErrors<T>
例如AutoErrors<B>
应该是
{
k3: Error[],
k4: AutoErrors<A>
}
我努力了
type AutoErrors<X> = {
[K in keyof X]-?: X[K] extends string ? Error[] : AutoErrors<X[K]>;
};
但它不能很好地工作,好像测试 X[K] 扩展字符串没有得到很好的解释
解决方案
您问题中发布的代码在 Playground 中有效,所以我怀疑发生了其他事情。事实证明,这个问题与可选属性有关,例如
type UhOh = AutoErrors<{ a?: string }>; // becomes {a: string}, not good
在这种情况下,原始AutoErrors<>
定义不起作用,因为string | undefined
不扩展string
. 如您所知,解决方法是检查string | undefined
而不是仅检查string
:
type AutoErrors<X> = {
[K in keyof X]-?: X[K] extends string | undefined ?
Error[] : AutoErrors<X[K]>
}
哪个有效:
type Okay = AutoErrors<{ a?: string }>; // becomes {a: Error[]}, as expected
很高兴你知道发生了什么。
推荐阅读
- c# - C# EF6 - 如何排除除 1 或 2 之外的所有属性
- django - Django:使用 Boto3 将视频文件上传到 S3 存储桶的问题
- php - gethostbyaddr 是否会显示我的服务器的 IP 地址?
- python - 运行 manage.py 时出现错误 ...import 错误无法导入名称后端
- .htaccess - Symfony 4:在 dev 中设置 webroot,以便浏览器可以访问使用 webpack encore 生成的文件
- c - 循环客户端程序接收到的缓冲区
- kubernetes - 是否可以使用 Litmus 测试 kafka
- powershell - 在powershell中拆分具有可变长度的字符串
- javascript - Javascript类 - 在回调中调用类方法
- python - 我如何将此记忆代码转换为动态编程(最小硬币变化问题)