javascript - 为什么 TypeScript 对象不能使用泛型类型进行索引?

标签 javascript generics typescript

在 JavaScript 中,普通的旧对象可以承受各种滥用。例如你可以这样写:

var obj = {};
var func = new Function() {};
obj[func] = 5; // totally fine
obj[func]; // returns 5

通过一些创意,您可以编写一个泛型类 SimpleSet<T>可能使用对象作为其在 JavaScript 或 TypeScript 中的后备存储。一种直接的方法可能涉及编写如下内容:

public add(val: T) {
  this._dict[val] = val;
}

这在 TypeScript 中不起作用。 为什么? add 的更宽松版本工作,见add2add3 .

class SimpleSet<T> {
  _dict: Object;
  constructor() {

  }

  // error:
  public add(val: T) {
    this._dict[val] = val;
  }

  // no error:    
  public add2(val: T) {
    this._dict[val as any] = val;
  }

  // no error:
  public add3(val: any) {
    this._dict[val] = val;
  }
}

add ,出现两个错误:

Type 'T' is not assignable to type 'Object[T]'.

Type 'T' cannot be used to index type 'Object'.

enter image description here

为什么?

最佳答案

TypeScript 不允许您这样做是因为它不起作用,就目前的情况而言,这是一个相当不错的理由。

JavaScript 对象的索引键是always (always) string。通过其他类型的索引将键强制转换为字符串,然后通过它进行查找。例如,正如评论中指出的那样,通过对象进行索引会生成键 "[object Object]"

您可以将 ES6 Map 对象用于有效的对象到值存储。

关于javascript - 为什么 TypeScript 对象不能使用泛型类型进行索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42773405/

相关文章:

javascript - jQuery:计算那些没有属性的元素

java - 无法使用通配符将对象添加到通用列表

Java 无法使用双冒号运算符找到正确的重载方法

javascript - 在调用 setState 之前修改 React 组件状态

javascript - 主干 : Making Collections out of JSON attributes advice, 并使事情变得更好

javascript - 使用 javascript/Angular 动画文本

javascript - 是否可以向链接添加小书签,使其 "changes"成为链接目标?

generics - SwiftUI 通用上下文菜单 View

javascript - 如何按特定键在数组中按字母顺序对对象进行分组?

javascript - Angular <img [src] ="someURL"> 如何访问代码中的重定向 URL?