动态地将属性名称添加到typescript接口

Wil*_*unn 7 typescript

我有一个常数:

const name = 'some/property';
Run Code Online (Sandbox Code Playgroud)

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

{[name]: 'Bob'}
Run Code Online (Sandbox Code Playgroud)

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

interface MyInterface {
  [name]: string;
}
Run Code Online (Sandbox Code Playgroud)

是动态定义typescript支持的属性名称?

Net*_*råm 7

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

const name = 'some/property';
type MyInterface = {
    [prop in typeof name]: string;
};
Run Code Online (Sandbox Code Playgroud)

这会强制所有类型的对象MyInterface都具有名为 的属性'some/property'


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

  • 这有帮助!我遇到了一个相关的问题,我想要类型内部的特定(动态给定)属性具有另一个给定类型,并最终得到 ```type PropertyType<K extends string | 数,T> = { [P in K]: T; }; const lala: PropertyType<'test', number> = { test: 1, };``` (2认同)

tos*_*skv 6

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

interface MyInterface {
  [name: string]: string;
}
const n = 'qweq';

let x: MyInterface = {
  'a': 'b'
}

x[n] = 'a';
Run Code Online (Sandbox Code Playgroud)

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

x[n]
Run Code Online (Sandbox Code Playgroud)

这里的操场上检查一下