繁体   English   中英

有什么方法可以进行hasOwnProperty类型检查吗?

[英]Any way to make hasOwnProperty typecheck?

给定一些接口

interface Foo {
  foo?: string
}

有什么办法可以让hasOwnProperty根据接口检查属性?

const f: Foo = { foo: 'a' }
f.hasOwnProperty('foo') // works fine
f.hasOwnProperty('fo')  // want this to throw error "fo" doesn't exist in Foo

我考虑过改

f.foo !== undefined

但这并不完全等效,因为假设foo可能存在但被分配给undefined即

const f: Foo = { foo: undefined }
f.hasOwnProperty('foo') // true
f.foo !== undefined     // false

我知道我可以编写自己的函数,使用正确的类型签名将hasOwnProperty包裹起来,例如has<T extends object>(obj: T, key: keyof T): boolean ,但是想知道是否还有其他本机替代方法。

obj.hasOwnProperty()检查它是否具有该属性,而不是该属性的值,因此无需进行类型检查。

我认为您需要重新考虑您的解决方案。 如果创建接口,则应该具有明确定义的共享属性。 如果您甚至不知道接口的类型,在接口中共享它们有什么意义?

您在这里混合了两种不同的东西。

TypeScript的类型系统仅在编译时存在,而hasOwnProperty()是运行时调用。

通常,在运行时您不会获得类型信息,因为它只是JavaScript。

同样,您也无论如何都不要进行这样的测试,因为JavaScript(以及因此TypeScript)是动态键入的,从而可以进行鸭子输入。

考虑一下:

function doSomething(x: Foo) {
  // ...
}
let y = { foo: 'foo', fo: 'fo' }
doSomething(y)

在这种情况下, doSomething()是否应该引发错误?

在消耗时( doSomething() ),您只关心您所需要的,而不会强迫调用方仅传递您所需要的。

另一方面,TypeScript编译器确实知道拼写错误是一个常见问题,并且将使用以下代码引发编译错误:

// Argument of type '{ fo: string; }' is not assignable to parameter of type 'Foo'.
// Object literal may only specify known properties, and 'fo' does not exist in type 'Foo'.
doSomething({ fo: 'foo' })

仅当您直接传递对象文字时,才会进行此检查。 这段代码不会触发错误:

let y = { fo: 'foo' }
doSomething(y)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM