我有以下功能:
const doSomething = (param: object) => {
// path param to another function/library
}重点是,我知道(并且想要强制执行) param是一个对象,而不是原始类型。在typescript object中fulfils此角色。
然而,我注意到:
const a: object = {
test: 5
}
console.log(a.test)给出一个typescript错误:Property 'test' does not exist on type 'object'.这是否意味着object应该只用于空对象?
我想知道在typescript中声明对象变量的最佳实践是什么,因为对象的确切字段在编译时是未知的。我注意到:
const b: Record<string, any> = {
test: 5
}
console.log(b.test)不会导致错误。那么,是否应该首选Record类型而不是object类型呢
发布于 2021-01-21 17:59:49
我认为有两种解决方案:要么将该参数声明为记录,要么在运行时检查该类型,如果该参数不是对象,则抛出异常。
对于第一种方法,您可以这样做:
const doSomething = (param: Record<string, any>) => {
// path param to another function/library
}对于第二种方法,您可以这样做:
const doSomething = (param: any) => {
if(typeof param !== 'object') throw new Error("Not an object")
// path param to another function/library
}但是,我必须指出,如果这个参数来自您自己的代码之外(例如在框架中),您将不会编译该参数,因此不会出现编译时的错误。如果该对象确实是在您自己的代码中声明的,那么当代码设计良好时,通常不会遇到这种问题。
这是一个很大的缺点,你必须绕过TS类型检查,到处传播any。也许有了更多的上下文,我们可以找出设计中可以改变的地方,这样你就不必处理这个问题了:)
https://stackoverflow.com/questions/65824537
复制相似问题