【问题标题】:In Typescript, is it possible to make a property name of a Javascript Object accept multiple values?在 Typescript 中,是否可以使 Javascript 对象的属性名称接受多个值?
【发布时间】:2017-01-26 10:13:09
【问题描述】:

例如,如果我创建一个新的对象类型:

interface NEWOBJECT {
    name: {};
}

是否有可能使名称可以是 name1 或 name2,以便我可以创建 NEWOBJECT,并将 任何一个 名称作为 NEWOBJECT 的属性名称?
像这样:

var object1: NEWOBJECT = {name1: {}};
var object2: NEWOBJECT = {name2: {}};

谢谢

【问题讨论】:

    标签: javascript object typescript key javascript-objects


    【解决方案1】:

    是的

    type NEWOBJECT = {
      [N in 'name1' | 'name2']?: {};
    }
    

    不幸的是,这仍然允许两个属性都存在或省略,所以我实际上会采用更精确的方法来使用 uniun 类型

    interface NEWOBJECT1 {
      name1: {};
    }
    
    interface NEWOBJECT2 {
      name2: {};
    }
    
    type NEWOBJECT = NEWOBJECT1 | NEWOBJECT2;
    

    确保您拥有最新的 TypeScript。

    【讨论】:

    • 我检查了您的解决方案,但它会引发错误。见typescriptlang.org/play/…
    • @SurenSrapyan:该链接中的任何内容都是针对您的。建议您在问题中包含您尝试过的内容和结果(错误详细信息)。
    • 抱歉,我使用了错误的语法,您需要使用类型别名。我更新了我的答案
    • 感谢您的回复,我认为这可行;这是唯一的方法吗?我觉得这是一种相当迂回的方式,因为在我的情况下,我只关心名称,并且重复值也感觉像是可以避免的事情,通常
    • hm.. 另外,当我尝试访问联合类型的动态变量的属性时,该属性必须在联合中的所有类型中,这有点让它毫无意义..
    【解决方案2】:

    如果你设置类型,它必须使用同名的属性。但是您可以声明可选属性。然后你可以用其中一个来声明你的变量。

    interface NEWOBJECT {
        name1?: {};
        name2?: {};
    }
    

    【讨论】:

    • 这不是最佳解决方案,因为它也不需要。两种类型的联合会更好,虽然我的方法更简洁
    • 实际上我的方法并没有让你摆脱可选性问题,所以你的方法也一样好,但我还是更喜欢联合
    • 感谢您的回复,我已经尝试过了,但是,它在创建对象时不允许接受任何属性或同时接受两个属性
    • 见这里typescriptlang.org/play/… 它允许使用一个属性创建
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多