【发布时间】:2019-08-05 19:52:55
【问题描述】:
我有一个常数:
const name = 'some/property';
我想定义一个接口,它使用名称作为属性的键,其方式类似于在对象声明中使用它,如下所示:
{[name]: 'Bob'}
我尝试了以下方法,但似乎这是在做其他事情:
interface MyInterface {
[name]: string;
}
打字稿支持动态定义属性名称吗?
【问题讨论】:
标签: typescript
我有一个常数:
const name = 'some/property';
我想定义一个接口,它使用名称作为属性的键,其方式类似于在对象声明中使用它,如下所示:
{[name]: 'Bob'}
我尝试了以下方法,但似乎这是在做其他事情:
interface MyInterface {
[name]: string;
}
打字稿支持动态定义属性名称吗?
【问题讨论】:
标签: typescript
您必须指定名称的类型。无法在对象声明中使用它,但您可以使用 [ ] 来设置和访问属性值。
interface MyInterface {
[name: string]: string;
}
const n = 'qweq';
let x: MyInterface = {
'a': 'b'
}
x[n] = 'a';
并以这种方式访问它。
x[n]
在操场上看看here。
【讨论】:
x.coolname 是 undefined。
MyInterface 类型的对象拥有qweg 属性
这可以通过 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, };