gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:07:28 35 4
gpt4 key购买 nike

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

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

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

有没有一种方法可以定义一个具有所有可选属性的类型,但仍然可以区分非对象类型,如 stringnumberboolean?

最佳答案

TS2.4+更新,现在有weak type detection如果没有重叠属性,这将阻止分配给所有可选属性类型,如 MaybeEmpty,因此现在不允许 var four: MaybeEmpty = 23


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


原答案:

没有。

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

TypeScript 使用“表观类型” 对此进行建模,其中原始类型的对象似乎具有其相应对象类型的成员。这是因为,直觉上,像这样的代码应该编译无误:

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?

有一个 issue on GitHub跟踪具有所有可选属性的接口(interface)在将分配给时实际上永远不会是错误源的一般问题。这是一件很难规范的事情。

关于typescript - 区分空对象类型和其他具体类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28122754/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com