区分空对象类型和其他具体类型

2023-11-29

所有这些都编译没有错误:

interface Empty { }
interface MaybeEmpty { a?: number; }

var one: Object = 20;
var two: Empty = 21;
var three: {} = 22;
var four: MaybeEmpty = 23;

有没有一种方法可以定义具有所有可选属性的类型,但仍然会歧视非对象类型,例如string, number, and boolean?


TS2.4+更新,现在有弱类型检测这将阻止分配给所有可选属性类型,例如MaybeEmpty如果没有重叠的属性,那么var four: MaybeEmpty = 23现在不允许。


TS2.2+ 更新,现在有一个object专门排除基元的类型。使用大括号的类似对象类型{} or { a?: number }仍然与原语兼容,如下所述。


原答案:

No.

根本问题是 JavaScript 通常将原始值视为对象类型的等价物(String/Number/etc)在需要对象的上下文中使用时(例如属性访问)。

TypeScript 使用以下模型对此进行建模“明显类型”原始类型的对象似乎具有其相应对象类型的成员。这是因为,直观上,这样的代码should编译无错误:

function fn(x: { toString(): string }) { /* ... */ }
fn(32); // Should be OK because (32).toString() is OK
fn('foo'); // Should be OK because ('foo').toString() is OK

这是这段代码的一小步:

function fn(x: { toString(): string; other?: whatever; }) { /* ... */ }
fn(32); // Should be OK
fn('foo'); // Should be OK

这段代码的另一个小步骤:

function fn(x: { other?: whatever; }) { /* ... */ }
fn(32); // OK, I guess?
fn('foo'); // OK, I guess?

有一个GitHub 上的问题跟踪一般问题,即具有所有可选属性的接口在分配时实际上永远不会成为错误来源to它。规范是一件非常困难的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

区分空对象类型和其他具体类型 的相关文章