繁体   English   中英

Typescript类型匹配对象,其valueOf最终返回一个字符串

[英]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被分配给一个对象常量,该常量可以被强制为一个ObjectvalueOf()方法返回一个新的原语,该原语也具有一个valueOf()方法,该方法产生可以被强制为一个Object的原语,依此类推。

在第二个代码块中,将valueOf()方法更改为foo() ,它不作为全局Object类型上的方法存在,因此无法满足原始StringableObject创建的无限valueOf()循环。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM