【问题标题】:A type or interface for an array with string properties具有字符串属性的数组的类型或接口
【发布时间】:2018-09-01 09:24:18
【问题描述】:

TypeScript 中有没有办法为数组定义类型或接口以接受随机字符串属性?例如,在 JavaScript 中,我们可以执行以下操作:

const list = [ 1, 2, 3, 4, 5 ];
list.foo = 'bar';
console.log(a); // [ 1, 2, 3, 4, 5, foo: 'bar' ]
console.log(a[1]); // 2
console.log(a.foo); // 'bar'

我想在 TypeScript 中定义一个允许这样一个数组的接口或类型。我尝试了以下方法:

interface IList extends Array<number> {
    [key: string]: string;
}

但它会产生一系列错误,即现有数组方法不可分配给类型字符串。

我可以在该界面中设置特定的键(例如,foo: string;,但我想知道是否有办法允许随机字符串属性?

【问题讨论】:

  • 您有在数组中使用非数字索引的真实用例吗?这非常奇怪,并且正是 Objects 的用途。另请注意,在上面的示例中,list.length === 5 尽管有额外的foo,但迭代器(如map)不会遇到它。

标签: typescript


【解决方案1】:

您可以使用type 关键字和交集来定义类型:

type IList = number[] & {
    [key: string]: string;
}

但是为该类型分配一个值有点棘手,因为数组不能分配给它(因为数组缺少字符串索引签名)。要解决此问题,您必须在分配数组时手动将数组转换为该类型:

const x: IList = [1, 2, 3]; // Error: Index signature missing in type number[]
const y = [1, 2, 3] as IList; // Okay

然后:

y[0] // inferred as number
y["foo"] // inferred as string
y.filter(x => x % 2); // inferred as number[]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2020-03-27
    • 2016-12-20
    • 2019-12-06
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    相关资源
    最近更新 更多