【问题标题】:dynamically adding a property name to a typescript interface将属性名称动态添加到打字稿界面
【发布时间】:2019-08-05 19:52:55
【问题描述】:

我有一个常数:

const name = 'some/property';

我想定义一个接口,它使用名称作为属性的键,其方式类似于在对象声明中使用它,如下所示:

{[name]: 'Bob'}

我尝试了以下方法,但似乎这是在做其他事情:

interface MyInterface {
  [name]: string;
}

打字稿支持动态定义属性名称吗?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    您必须指定名称的类型。无法在对象声明中使用它,但您可以使用 [ ] 来设置和访问属性值。

    interface MyInterface {
      [name: string]: string;
    }
    const n = 'qweq';
    
    let x: MyInterface = {
      'a': 'b'
    }
    
    x[n] = 'a';
    

    并以这种方式访问​​它。

    x[n]
    

    在操场上看看here

    【讨论】:

    • 这不起作用(或者我的问题可能不清楚)。在您的示例中,x.coolnameundefined
    • 你是对的,在 X 对象上创建了一个名为 n 的属性。我已经更新了我的答案。 :)
    • 谢谢,但这完全绕过了类型检查,这样做不会强制MyInterface 类型的对象拥有qweg 属性
    • 这不是很动态。据我所知,您无法定义一种类型,该类型允许对象将任何字符串作为键,同时强制执行特定的键名。第一个包括第二个。
    【解决方案2】:

    这可以通过 TypeScript 2.1 中引入的映射类型来完成:

    const name = 'some/property';
    type MyInterface = {
        [prop in typeof name]: string;
    };
    

    这会强制所有MyInterface 类型的对象拥有一个名为'some/property' 的属性。


    我想这个答案对你来说为时已晚,但希望它可以帮助其他人。我很早就在自己搜索类似问题的解决方案时发现了这个问题。

    【讨论】:

    • 这有帮助!我有一个相关的问题,我希望一个类型内部的特定(动态给定)属性具有另一个给定类型,并最终得到type PropertyType<K extends string | number, T> = { [P in K]: T; }; const lala: PropertyType<'test', number> = { test: 1, };
    猜你喜欢
    • 2023-01-16
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2017-03-24
    • 2018-06-13
    • 1970-01-01
    相关资源
    最近更新 更多