查看此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类型的安全性?
答案 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();