如何解决带有 toString() 的类可以用作字符串,但是如何说服 TypeScript 编译器呢? 相反,一种更安全的方法
我的类实现了 toString()
以允许我在构建其他对象时方便地使用任何实例作为属性名称。 TypeScript 编译器虽然不相信并输出:a computed property name must be of type 'string'
如何以满足编译器要求的方式声明我的类?
class Foo {
name: string
constructor(name: string) { this.name = name; }
toString() { return this.name; }
}
可以这样使用:
const myFoo = new Foo('Clytemnestra');
const someObject = { [myFoo]: 'she murders Agamemnon'};
目前上面的最后一行产生了上述类型错误。
解决方法
你不能
您不能“说服”Typescript 静态类型检查器忽略对象的类型并依赖强制类型——这会破坏静态类型检查的全部目的。
但你可以...
0verride 静态确定的类型,通过这样更改违规行:
const someObject = { [myFoo as unknown as string ]: 'she murders Agamemnon'};
马上就闻起来很糟糕。
好的,怎么样:
const someObject = { [ myFoo.toString() ]: 'she murders Agamemnon'};
这稍微好一些,因为您明确地对字符串进行了“强制”。
但这两种方法最终都是一个坏主意。任何对象都可以被强制转换为字符串,默认值通常是“[object Object]”。依赖 toString()
方法会破坏类型安全。所以你又一次违背了静态类型检查的目的。你一定会问:我为什么要使用 Typescript?
相反,一种更安全的方法
class Subject {
name: string
city: string
constructor(name: string,city: string) {
this.name = name
this.city = city
}
}
const vengefulWife = new Subject('Clytemnestra','Mycenae');
const summaries = new Map<Subject,string>()
summaries.set(vengefulWife,'she murders Agamemnon')
for (const [key,value] of summaries) {
console.log(`${key.name} of ${key.city}: ${value}`);
}
因为 Typescript 知道 key
的类型,所以它可以识别
对 key.name
和 key.city
的引用为有效
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。