我正在尝试定义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 myObject
和myObject.hasOwnProperty("data")
来检查属性是否存在,但是似乎都不影响TypeScript推断的myObject
的类型以包含data
,但它仍然是普通的object
类型。
我可以将函数签名更改为hasDataProperty(myObject: any)
或使用类型声明将类型从unknown
更改,但是这两个选项都忽略了对象的实际属性,这可能会导致类型保护程序逻辑中的错误。
是否有一种方法可以在不使用类型断言或myObject
的情况下确定data
是否具有any
属性?
您是否尝试使用“ 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'
}