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

问题描述 投票:0回答:1

我正在尝试定义user-defined type guard以验证unknown变量是否具有data: string属性。我的代码定义如下。

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.

[如果您打开操场,您将在第8行看到指示Property 'data' does not exist on type 'object'.的错误,这是有道理的,因为我尚未验证data上是否存在myObject属性。

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

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

是否有一种方法可以在不使用类型断言或myObject的情况下确定data是否具有any属性?

typescript types type-inference
1个回答
0
投票

您是否尝试使用“ in”运算符? Doc

type DataObject = {
  data: string
};

function hasDataProperty(myObject: any): myObject is DataObject {
    return "data" in myObject
}

let a = {data: 'a'}
if (hasDataProperty(a)) {
  console.log(a.data); //
} else {
  console.log(a.data); //error
}

似乎它确实可以满足您的要求,只是它不检查类型。

只是确保我要添加另一个类型检查,如下所示:

function hasDataProperty(myObject: any): myObject is DataObject {
    return "data" in myObject && typeof myObject.data === 'string'
}
© www.soinside.com 2019 - 2024. All rights reserved.