在Typescript中,如何允许类型具有指向该类型的递归值的泛型的所有键?

时间:2019-07-18 21:22:27

标签: typescript typescript-typings typescript-generics

现在我有类似这样的东西,其中“ 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]>
}

这显然是行不通的,并且想知道是否可以实现类似的事情。

1 个答案:

答案 0 :(得分:1)

是的。这是怎么做

type Validation<V> = {
    [K in Extract<keyof V, string>]: Validation<V[K]>
} & {
    $isValid: boolean
    $isValidating: boolean
    $value: V
}
  1. 您应该使用mapped type,所以您应该写K in ...

      

    语法类似于内部带有for .. in的索引签名的语法。分为三个部分:

         
        
    • 类型变量K,它依次绑定到每个属性。

    •   
    • 字符串文字联合键,其中包含要迭代的属性的名称。

    •   
    • 属性的结果类型。
    •   
  2. 要添加其他属性,请使用intersection,因为不可能直接将其他属性添加到映射类型。