Javascript 有没有办法进行hasOwnProperty类型检查?

Javascript 有没有办法进行hasOwnProperty类型检查?,javascript,typescript,types,Javascript,Typescript,Types,给定一些接口 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 但这并不完全

给定一些接口

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
可能存在,但被分配给未定义的对象,即

const f: Foo = { foo: undefined }
f.hasOwnProperty('foo') // true
f.foo !== undefined     // false
我知道我可以编写自己的函数,用正确的类型签名包装hasOwnProperty,比如
has(obj:T,key:keyof T):boolean
,但我想知道是否有更自然的替代方法。

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


我认为你需要重新考虑你的解决方案。如果你制作了一个接口,你应该有明确定义的共享属性。如果你甚至不知道它将是什么类型,那么在界面中共享它们有什么意义呢

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

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

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

另外,您无论如何也不应该做这样的测试,因为JavaScript(以及TypeScript)是动态类型化的,它支持duck类型化

考虑这一点:

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)

嗯,我明白了,但我想说的是,如果你已经为一个对象定义了一个接口,那么接受那些你知道不属于该接口的参数是没有意义的。最有可能发生的事情是你输入了一个错误,而不是你在寻找一些在你的对象上永远不可能存在的随机属性。因此需要进行类型检查。但是.hasOwnProperty()不检查继承的“链”,而只检查它自己的对象。正是如此……那么,在上面的示例中,我为什么要检查
f
中除
foo
之外的任何内容呢。您可以使用“in”。。就像obj中的“t”一样,它将出现在原型链中,我认为您需要重新考虑您的解决方案。如果你制作了一个接口,你应该有明确定义的共享属性。如果你甚至不知道它将是什么类型,那么在界面中共享它们有什么意义呢?