Typescript接口,强制执行额外属性的类型

时间:2017-06-04 20:45:35

标签: typescript types interface

假设我想创建一个界面来描述这种类型的对象:

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;
}

但这个定义并不像预设的那样。

有没有办法强制执行额外属性的类型?

2 个答案:

答案 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;