代码之家  ›  专栏  ›  技术社区  ›  D. Pardal

添加新属性时,ts(1170)映射类型出错

  •  1
  • D. Pardal  · 技术社区  · 4 年前

    我有以下代码:

    enum A {
        FOO = 0,
        BAR = 1,
        BAZ = 2
    }
    type B = {
        [key in A]: number
    }
    declare let b: B;
    

    很好用。我可以用 b[A.FOO] b[123] . 但是,我也希望能够使用 b.length ,但当我向类型添加属性时 B

    type B = {
        length: number,
        [key in A]: number
    }
    

    …我得到以下错误

    A computed property name in a type literal must refer to an expression whose type is a literal type or a 'unique symbol' type.ts(1170)
    A computed property name must be of type 'string', 'number', 'symbol', or 'any'.ts(2464)

    我怎样才能解决这个问题?

    1 回复  |  直到 4 年前
        1
  •  2
  •   jcalz    4 年前

    你发现 mapped type 窗体的 {[K in XXX]: YYY} 不允许其他属性。幸运的是,使用 intersection type

    type B = {
        [key in A]: number
    } & { length: number };
    

    在您的特定情况下,因为所有这些属性都是 number ,也可以使用单个映射类型,其中键类型是 union A 枚举值和 literal type "length" :

    type B = {
        [key in A | "length"]: number;
    }
    

    两个版本都可以根据您的需要工作:

    let b: B = {
        [A.FOO]: 12,
        [A.BAR]: 34,
        [A.BAZ]: 56,
        length: 78
    } // okay
    

    Playground link to code