JavaScript构造函数使用new调用时能否返回原始类型值?
结论
在符合ECMAScript标准的JavaScript实现中,不存在可以通过new语义调用返回原始值的构造函数,你观察到的TypeScript允许声明new () => string这类构造函数类型,属于TypeScript类型系统的设计特性,和实际JavaScript运行时的行为没有对应关系。
根据ECMAScript规范对构造函数[[Construct]]内部方法的要求,构造调用的返回值必须是对象类型,你测试的三类场景已经覆盖了所有可能的构造函数实现路径,没有其他可实现的方案:
- 内置构造函数:
Number/String/Boolean等内置类型的new调用固定返回包装对象,只有作为普通函数调用时才返回原始值 - 自定义构造函数:构造函数内的
return语句只有返回对象时才会覆盖默认生成的this实例,返回原始值会被直接忽略,最终还是返回实例对象 - Proxy的construct陷阱:规范明确要求陷阱的返回值必须是对象,返回原始值会直接抛出
TypeError
TypeScript允许这类声明的原因
TypeScript采用结构化类型系统,在设计构造函数类型语法时,没有对返回值做必须为对象的强制约束,和普通函数类型的声明规则保持了统一。这类声明仅用于类型层面的标注、类型体操等场景,不存在实际能匹配该类型的JavaScript运行时值。
内容的提问来源于stack exchange,提问作者GOTO 0
相关产品推荐
相关产品推荐

