现在我有类似这样的东西,其中“ any”可以充当通用的“ V”
interface Validation<V> {
$isValid: boolean
$isValidating: boolean
$value: V
[prop: string]: boolean | V | Validation<V>
}
我想用V中的任何字符串键K替换字符串索引类型,这将返回一个Sub Validation接口。
interface Validation<V> {
$isValid: boolean
$isValidating: boolean
$value: V
[K extends Extract<keyof V, string>]: Validation<V[K]>
}
这显然是行不通的,并且想知道是否可以实现类似的事情。
答案 0 :(得分:1)
是的。这是怎么做
type Validation<V> = {
[K in Extract<keyof V, string>]: Validation<V[K]>
} & {
$isValid: boolean
$isValidating: boolean
$value: V
}
您应该使用mapped type,所以您应该写K in ...
。
语法类似于内部带有
for .. in
的索引签名的语法。分为三个部分:
类型变量K,它依次绑定到每个属性。
字符串文字联合键,其中包含要迭代的属性的名称。
- 属性的结果类型。
要添加其他属性,请使用intersection,因为不可能直接将其他属性添加到映射类型。