可以利用符号来保证类型安全吗?

时间:2018-09-05 11:22:26

标签: typescript ecmascript-6 es6-symbol

查看此Typescript code

class A {

} 

let a = new A();
let s: symbol = Symbol('sym');

a[s] = 2;
a[s] = 'f';
a[s] = new Date();

//no errors

我们可以看到相同的符号属性引用的是差异类型。

问题:

是否可以使用符号并获得TS类型的安全性?

2 个答案:

答案 0 :(得分:2)

如果打开noImplicitAny,由于未声明symbol属性并且A没有索引签名,因此在所有三个分配上都会出错。您可以按以下方式声明属性:

const s: unique symbol = Symbol('sym');
class A {
  [s]: number;
}

let a = new A();

a[s] = 2;  // OK
a[s] = 'f';  // Error
a[s] = new Date();  // Error

(请注意,将Symbol('sym')称为unique symbol是个谎言。考虑改用Symbol()。我记得在讨论该问题时遇到了问题,但我找不到它现在。)

答案 1 :(得分:0)

  

TS1023:索引签名参数类型必须为'string'或   “数字”。

似乎您班上的钥匙必须是字符串或数字。

class A {
  [key: symbol]: any; // invalid
} 

您是否正在寻找类似的东西?

class A {
  [key: string]: number | string | Date;
  [key: number]: number | string | Date;
}

const a = new A();
const s: symbol = Symbol('sym');

a[s] = 2;
a[s] = 'f';
a[s] = new Date();