我将我的泛型类型定义为
interface IDictionary{ [key: string|number]: TValue; }
但是TSLint的抱怨.我该如何定义一个可以作为键的对象索引类型?我也试过这些,但没有运气.
interface IDictionary{ [key: TKey]: TValue; } interface IDictionary { [key: TKey]: TValue; } type IndexKey = string | number; interface IDictionary { [key: IndexKey]: TValue; } interface IDictionary { [key: TKey]: TValue; }
以上都不是.
小智.. 28
你可以通过使用一个IDictionary
自动转换为字符串来实现这一点
.
以下是一个用法示例:
interface IDictionary{ [id: string]: TValue; } class Test { private dictionary: IDictionary ; constructor() { this.dictionary = {} this.dictionary[9] = "numeric-index"; this.dictionary["10"] = "string-index" console.log(this.dictionary["9"], this.dictionary[10]); } } // result => "numeric-index string-index"
如您所见,字符串和数字索引是可互换的.
你可以通过使用一个IDictionary
自动转换为字符串来实现这一点
.
以下是一个用法示例:
interface IDictionary{ [id: string]: TValue; } class Test { private dictionary: IDictionary ; constructor() { this.dictionary = {} this.dictionary[9] = "numeric-index"; this.dictionary["10"] = "string-index" console.log(this.dictionary["9"], this.dictionary[10]); } } // result => "numeric-index string-index"
如您所见,字符串和数字索引是可互换的.
在javascript中,对象的键只能是字符串(在es6
符号中也是如此).
如果你传递一个数字,它会转换成一个字符串:
let o = {}; o[3] = "three"; console.log(Object.keys(o)); // ["3"]
如你所见,你总能得到{ [key: string]: TValue; }
.
使用Typescript,您可以使用number
s键作为键来定义地图:
type Dict = { [key: number]: string };
并且编译器将检查在分配值时始终将数字作为键传递,但在运行时,对象中的键将是字符串.
因此,您可以拥有{ [key: number]: string }
或{ [key: string]: string }
不拥有string | number
以下内容的联合:
let d = {} as IDictionary; d[3] = "1st three"; d["3"] = "2nd three";
您可能希望d
在这里有两个不同的条目,但实际上只有一个.
你可以做的是使用Map
:
let m = new Map(); m.set(3, "1st three"); m.set("3", "2nd three");
在这里,您将有两个不同的条目.