当前位置:  开发笔记 > 编程语言 > 正文

Typescript中的对象索引键类型

如何解决《Typescript中的对象索引键类型》经验,为你挑选了2个好方法。

我将我的泛型类型定义为

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 { [key: string]: TValue }自动转换为字符串来实现这一点 .

以下是一个用法示例:

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"

如您所见,字符串和数字索引是可互换的.



1> 小智..:

你可以通过使用一个IDictionary { [key: string]: TValue }自动转换为字符串来实现这一点 .

以下是一个用法示例:

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"

如您所见,字符串和数字索引是可互换的.



2> Nitzan Tomer..:

在javascript中,对象的键只能是字符串(在es6符号中也是如此).
如果你传递一个数字,它会转换成一个字符串:

let o = {};
o[3] = "three";
console.log(Object.keys(o)); // ["3"]

如你所见,你总能得到{ [key: string]: TValue; }.

使用Typescript,您可以使用numbers键作为键来定义地图:

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");

在这里,您将有两个不同的条目.

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有