Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript类型匹配对象,其值of最终返回字符串_Typescript_Typescript Typings - Fatal编程技术网

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()
循环

希望这有帮助