假设我想创建一个界面来描述这种类型的对象:
let myObj= {
"count": 3,
"key1": "foo",
"key2": "bar",
"key3": "baz"
};
这些对象的属性值始终为类型编号,其余属性为字符串
如果我使用这样的索引签名定义我的界面:
interface MyObect {
count: number;
[key: string]: string;
}
我收到了编译错误:
[ts] Property 'count' of type 'number' is not assignable to string index type 'string'.
所以我必须这样定义:
interface MyObect {
count: number;
[key: string]: any;
}
但这个定义并不像预设的那样。
有没有办法强制执行额外属性的类型?
答案 0 :(得分:3)
我通过使用联合类型实现了类似的东西:
type MyObject =
{
count : number
} & {
[key : string] : string
}
这对于使用对象有效(我正在使用TypeScript 2.3.2),如下所示
// x : MyObject
const count : number = x.count;
const foo : string = x.foo
但正如所指出的,这项任务仍然失败
const x : MyObject = {
count: 10,
foo: 'bar'
}
所以这可能仅在某些情况下有用。
答案 1 :(得分:1)
在过去的两个月中,这个问题以许多微妙的形式出现。通常作为combination of a dictionary and an array。
或者,您可以使用错误抑制来保留类型的最简单定义,而TypeScript编译器实际上可以完美地使用该类型。
它使用错误抑制注释,这通常是一件坏事。在初始化时还需要一些额外的工作。其余用法如您所愿。
这里是使用dictarry技术翻阅您的特定示例的内容。
interface MyObject {
[key: string]: string;
// @ts-ignore: I'm creating a Dictarray!
count: number;
}
let myObj = { count: 0 } as MyObject;
myObj.key1 = "a string";
myObj.count = 4;
// Error, 1 is not a string - as you'd expect
myobj.key2 = 1;
myObj = {
"count": 3,
"key1": "foo",
"key2": "bar",
"key3": "baz"
} as unknown as MyObject;
const str = myObj.key1;
const num = myObj.count;