![](/img/trans.png)
[英]Is there any way to recover from somebody changing Object.prototype.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.