![](/img/trans.png)
[英]How to declare an object whose properties are of type string only using TypeScript?
[英]Typescript type matching object whose valueOf eventually returns a string
我正在过度设计一个与string
匹配的类型,或者valueOf()
进行递归求值时其valueOf()
最终返回string
。
type Stringable = string | StringableObject;
interface StringableObject {
valueOf(): Stringable;
}
let x: Stringable;
// should work:
x = 'foo';
x = {
valueOf() { return 'foo'; }
};
x = {
valueOf() {
return {
valueOf() { return 'foo'; }
};
}
};
// should not work but do:
x = {}; // valueOf() returns an object -- a reference to x, itself
x = {
valueOf() { return 1; } // valueOf() returns a number
};
Object.prototype.valueOf()
未被覆盖时会返回一个object
,而不是一个string
,所以我很困惑为什么最后一种情况会编译,而我需要进行更改以使它们无法编译。
我怀疑我需要创建一个使用infer
关键字的泛型类型,但是我仍在尝试如何正确使用infer
。
奇怪的是,如果我将valueOf
更改为foo
,它会完成我所期望的。
type Stringable = string | StringableObject;
interface StringableObject {
foo(): Stringable;
}
// do not compile
x = {};
x = {
foo() { return 1; }
};
x = {
foo() {
return {
foo() { return 1; }
};
}
};
我认为它必须与valueOf()
本身的性质有关,或者与valueOf()
位于原型上而不是作为对象本身的定义有关。 但是,我不知道为什么会这样。
这里有一些误解,所以我将尝试分别解决每个误解,希望这将有助于解释为什么您的代码未产生预期的结果。
Object.prototype.valueOf()
未被覆盖时返回一个对象,而不是字符串,所以我很困惑为什么最后一种情况会编译,而我需要更改使其不被编译。
valueOf()
返回调用它的对象的原始值。 JavaScript将字符串文字(例如'foo'
)视为原语,但是由于原语没有属性,因此JavaScript将原语强制转换为Objects(实际上,它将尽可能强制转换任何类型以使操作有效)。为了允许在原语为无效类型的情况下进行操作。 请查看此StackOverflow帖子 ,以获取有关对象强制的更多信息。 这对您的意义是valueOf()
可能不一定会返回Object,而是会调用任何类型的原始值:
> "foo".valueOf()
'foo'
> let x;
> x = {}; x.valueOf()
{}
> x = 10; x.valueOf()
10
我正在过度设计一个与字符串匹配的类型,或者对它的对象进行递归求值时其valueOf()最终返回一个字符串。
StringableObject
接口未描述其valueOf()
方法最终将返回字符串的类型。 它描述了一种类型是其valueOf()
方法返回一个类型具有valueOf()
将返回一个类型与方法valueOf()
方法,并如此循环往复而这正是与这条线在你的第一个代码发生块:
x = {};
x
被分配给一个对象常量,该常量可以被强制为一个Object
其valueOf()
方法返回一个新的原语,该原语也具有一个valueOf()
方法,该方法产生可以被强制为一个Object
的原语,依此类推。
在第二个代码块中,将valueOf()
方法更改为foo()
,它不作为全局Object
类型上的方法存在,因此无法满足原始StringableObject
创建的无限valueOf()
循环。
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.