Typescript类型匹配对象,其值of最终返回字符串
我过度设计了一个与Typescript类型匹配对象,其值of最终返回字符串,typescript,typescript-typings,Typescript,Typescript Typings,我过度设计了一个与string匹配的类型,或者一个对象,其valueOf()递归计算后最终返回一个string type Stringable=string | StringableObject; 接口StringableObject{ valueOf():可串; } 设x:Stringable; //应: x=‘foo’; x={ valueOf(){return'foo';} }; x={ 价值(){ 返回{ valueOf(){return'foo';} }; } }; //不应工作,但应
string
匹配的类型,或者一个对象,其valueOf()
递归计算后最终返回一个string
type Stringable=string | StringableObject;
接口StringableObject{
valueOf():可串;
}
设x:Stringable;
//应:
x=‘foo’;
x={
valueOf(){return'foo';}
};
x={
价值(){
返回{
valueOf(){return'foo';}
};
}
};
//不应工作,但应:
x={};//valueOf()返回一个对象——对x本身的引用
x={
valueOf(){return 1;}//valueOf()返回一个数字
};
Object.prototype.valueOf()
未被覆盖时,返回的是一个对象,而不是字符串,因此我不明白为什么最后的案例会编译,以及我需要做哪些更改才能使它们不编译
我怀疑我需要创建一个使用expert
关键字的泛型类型,但我仍在尝试探索如何正确使用expert
奇怪的是,如果我将valueOf
更改为foo
,它会实现我的预期
type Stringable=string | StringableObject;
接口StringableObject{
foo():可串;
}
//不编译
x={};
x={
foo(){return 1;}
};
x={
foo(){
返回{
foo(){return 1;}
};
}
};
我认为这一定与valueOf()
本身的性质有关,或者与valueOf()
位于原型上而不是作为对象本身的定义有关。但是,我不知道为什么会出现这种情况。这里有一些误解,因此我将尝试逐一解决,希望这将有助于解释为什么您的代码不能产生预期的结果
Object.prototype.valueOf()
在未被覆盖时,返回的是一个对象,而不是字符串,因此我不明白为什么最后的案例会编译,以及我需要做哪些更改才能使它们不编译
valueOf()
返回调用它的对象的原语值。字符串文本(例如,'foo'
)被JavaScript视为基本体,但由于基本体没有属性,JavaScript将基本体强制为对象(事实上,为了使操作有效,它将尽可能强制任何类型),以便允许基体为无效类型的操作。查看以获取有关对象强制的更多信息。这对您意味着,valueOf()
可能根本不一定返回对象,而是调用它的任何类型的原语值:
> "foo".valueOf()
'foo'
> let x;
> x = {}; x.valueOf()
{}
> x = 10; x.valueOf()
10
我过度设计了一个匹配字符串或对象的类型,当递归计算valueOf()时,该对象最终返回一个字符串
StringableObject
接口未描述其valueOf()
方法最终将返回字符串的类型。它确实描述了一个类型,该类型的valueOf()
方法将返回一个带有valueOf()
方法的类型,该方法将返回带有valueOf()
方法的类型,依此类推,这正是您的第一个代码块中的此行所发生的情况:
x = {};
x
被分配给一个对象文字,该对象文字可以强制转换为对象
,其valueOf()
方法返回一个新的原语,该原语还具有一个valueOf()
方法,该方法生成一个可以强制转换为对象
的原语,依此类推
在第二个代码块中,您将valueOf()
方法更改为foo()
,该方法在全局对象
类型上不存在,因此无法满足原始StringableObject
创建的无限valueOf()
循环
希望这有帮助