【问题标题】:Dynamic Keys and value type checking in typescript打字稿中的动态键和值类型检查
【发布时间】:2019-04-01 14:19:19
【问题描述】:

我已经开始学习打字稿了。我确信可能会有与此类似的票证,但想快速了解一下。

i have keys
type keys = 'a' | 'e' | 'i' | 'o' | 'u';
I want these to restrict the possible a keys in an object
{
numbers : number;
symbols : string;
[key : keys] : string | number | boolean;
}

但是我得到了这个错误An index signature parameter type cannot be a union type. Consider using a mapped object type instead. 所以我尝试了

{
numbers : number;
symbols : string;
[key in keys] : string | number | boolean;
}

但我从 TSLint 得到了another error。 我希望如果有人可以通过示例帮助我解决这些问题,它们为什么以及如何变化?请和解决方案。

我想要的结果是

key with only values of a, e, i, o, u and these Keys can have any of the string, number, boolean types of values.

【问题讨论】:

    标签: javascript typescript type-conversion


    【解决方案1】:

    Mapped typesindex signatures 相似,但又不相同。如您所见,索引签名的键只能是stringnumber。映射类型允许您指定一组更窄的键,但您不能将其他属性添加到映射类型。

    可以做的是使用intersection

    type X = {numbers: number; symbols: string} & {[K in keys]: string | number | boolean}
    
    // type X = {
    //  numbers: number;
    //  symbols: string;
    // } & {
    //  a: string | number | boolean;
    //  e: string | number | boolean;
    //  i: string | number | boolean;
    //  o: string | number | boolean;
    //  u: string | number | boolean;
    // }
    

    这与您想要的基本相同,因为交集A & B 意味着您必须同时符合AB

    表示这种类型的另一种方法是使用映射的conditional 类型来表示整个事物而不是交集。这对您来说看起来会更复杂,但评估结果会更好地供人们使用:

    type Y = { [K in "numbers" | "symbols" | keys]:
      K extends "numbers" ? number :
      K extends "symbols" ? string :
      string | number | boolean };
    
    // type Y = {
    // a: string | number | boolean;
    // e: string | number | boolean;
    // i: string | number | boolean;
    // o: string | number | boolean;
    // u: string | number | boolean;
    // numbers: number;
    // symbols: string;
    

    无论哪种方式都应该有效。希望有帮助;祝你好运!

    【讨论】:

      【解决方案2】:
      
          type keys =  'a' | 'e' | 'i' | 'o' | 'u'
      
          type Dynamic = {
            [index in  keys]: string | number | boolean
          }&{
            numbers : number;
            symbols : string;
          }
      
      

      【讨论】:

      • 有解释的答案更容易接受+投票
      猜你喜欢
      • 2020-03-09
      • 1970-01-01
      • 2020-01-23
      • 2018-11-03
      • 2022-01-25
      • 2021-05-12
      • 2022-12-19
      • 2021-05-14
      • 2020-05-21
      相关资源
      最近更新 更多