gpt4 book ai didi

typescript - TypeScript 可以推断对象的属性吗?

转载 作者:行者123 更新时间:2023-12-02 16:51:12 25 4
gpt4 key购买 nike

我试图定义一个 user-defined type guard验证 unknown 类型的变量是否具有 data 属性。我的代码定义如下。

type DataObject = {
data: string
};

function hasDataProperty(myObject: unknown): myObject is DataObject {
return typeof myObject === "object" &&
!!myObject &&
typeof myObject.data === "string";
}

Try it on the Typescript Playground.

如果你打开 playground,你会在第 8 行看到一个错误,指示 Property 'data' does not exist on type 'object'.,这是有道理的,因为我还没有验证data 属性存在于 myObject 上。

我尝试同时使用 "data"in myObjectmyObject.hasOwnProperty("data") 来检查该属性是否存在,但似乎都不会影响 TypeScript 的myObject 的推断类型包括 data,它仍然是一个普通的 object 类型。

我可以将函数签名更改为 hasDataProperty(myObject: any) 或使用类型断言将类型从 unknown 更改,但这两个选项都忽略了对象的实际属性,这可能会导致类型保护逻辑中的错误。

有没有办法在不使用类型断言或any的情况下确定myObject是否具有data属性?

最佳答案

好的,在谷歌搜索并与其他人讨论后,我得出了这个解决方案:

type DataObject = {
data: string
};

function isDataObjectLike(v: unknown): v is { [K in keyof DataObject]: unknown } {
return typeof v === 'object'
&& v !== null
&& 'data' in v;
}

function hasDataProperty(v: unknown): v is DataObject {
return isDataObjectLike(v)
&& typeof v.data === 'string';
}

typescript/play

并不是说它显着比带有 any 的更好,但它提供了来自编译器的更多安全性。

关于typescript - TypeScript 可以推断对象的属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58615109/

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