【发布时间】:2018-12-04 04:26:29
【问题描述】:
你好有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] extends string 没有得到很好的解释
【问题讨论】:
-
“我试过了,但效果不好”……具体来说,你试过什么?
-
对不起,我修正了错字
-
你使用的是什么版本的 TypeScript?它有什么不好的地方?
-
您上面的代码在the playground 中工作,所以正在发生其他事情。
-
你是绝对正确的@jcalz,但我在 VSCOde 编辑器中看到一个错误,因为我正在尝试使用仅包含可选键的界面。为此,我添加到状态 X[K] 扩展字符串 |不明确的。你绝对应该得到奖励,因为你的陈述帮助我找出问题所在,发布最终版本,我会投票给你。
标签: typescript