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

dx_over_dt

我正在过度设计与string或对象匹配的类型,该对象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正确使用它

奇怪的是,如果我更改valueOffoo,它会达到我的期望。

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()返回调用它的对象的原始值。'foo'JavaScript将字符串文字(例如)视为原语,但是由于原语没有属性,因此JavaScript将原语强制转换为对象(实际上,它将尽可能强制转换任何类型以使操作有效)以允许基本类型为无效类型的操作。请查看此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文字,该文字可以被强制转换成ObjectvalueOf()原语,方法的方法返回一个新的原语,该原语也具有一种valueOf()方法,方法可以产生一个可以被强制转换为an Objectinfinitum的原语

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

希望这可以帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将一个字符串与另一个字符串匹配并为其返回 true?

调用多个异步方法以最终返回一个字符串值

返回一个字符串

Perl - 从一个字符串返回多个“相同”匹配项

如何从匹配的字典值中返回一个字符串?

php-ffi: 返回类型 const char* 是一个字符串

给定一个字符串,返回一个字符串

Typescript-函数应该返回一个字符串,而不是()-> string

Pandas strptime 返回一个字符串而不是 DateTime 对象

如何检查一个字符串是否匹配多个字符串并根据匹配返回值

分配一个字符串但返回一个对象 - 浏览器在玩吗?

Rails 读取 cookie 返回一个字符串而不是一个对象

ReactJs - 在一个对象中返回一个字符串和标签 html

正则表达式返回匹配括号中的特定字符串并返回其在括号中的下一个和前一个字符串

在字典的字典中找到一个字符串作为值,并返回其键

函数包含特定字符串返回一个字符串

split返回一个字符串代替字符串数组

介绍一个字符串来定义一个类型

匹配一个字符串,但如果包含另一个字符串则不匹配

查找一个ID并返回一个字符串值

返回一个字符串而不是一个整数

接受一个字符串并在汇编中显示其长度

取一个字符串并用整数对其进行修改

字符串中的最后一个字符完全匹配

如何在TSQL中匹配字符串的最后一个字符?

匹配特殊字符之间的最后一个字符串

从字符串中删除匹配的第一个字符

计算第一个字符匹配的字符串

如何模式匹配字符串中的第一个字符