描述
我编写了一个带有动态覆盖的简单类Symbol.toPrimitive
:
interface PrimitiveHintsMap {
"number": number;
"boolean": boolean;
"string": string;
}
class Timespan {
#duration = 0;
[Symbol.toPrimitive]<K extends keyof PrimitiveHintsMap>(hint: K): PrimitiveHintsMap[K] {
switch (hint) {
case `number`: return this.#duration;
case `boolean`: return Boolean(this.#duration);
case `string`: return this.toString();
default: throw new TypeError(`Invalid '${hint}' primitive hint`);
}
}
}
...就像对内置 DOM 侦听器所做的那样:
return
该函数每次都会抱怨
类型“number”不可分配给类型“PrimitiveHintsMap[K]”。
类型“number”不可分配给类型“never”。ts(2322)
问题
我哪里错了?
你从哪里找到它的never
?
无处。在这样困难的地方,ts无法理解类型,因此需要显式强制转换。
但是,我对斜杠引号中的 switch 中的行感到困惑 - 我担心它们会干扰推断必要的限制,但在您的情况下,直引号没有帮助。
这是所有值的交集
PrimitiveHintsMap
,即number & boolean & string
- thisnever
。如果你真的想要,种姓可以用函数重载代替,但本质上它只是杀死一些类型检查,所以我可能会通过种姓来做到这一点。
操场