首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于在编译时字段未知的对象,应使用typescript中的哪种类型?

对于在编译时字段未知的对象,应使用typescript中的哪种类型?
EN

Stack Overflow用户
提问于 2021-01-21 17:30:15
回答 1查看 47关注 0票数 1

我有以下功能:

代码语言:javascript
复制
const doSomething = (param: object) => {
  // path param to another function/library
}

重点是,我知道(并且想要强制执行) param是一个对象,而不是原始类型。在typescript objectfulfils此角色。

然而,我注意到:

代码语言:javascript
复制
const a: object = {
  test: 5
}
console.log(a.test)

给出一个typescript错误:Property 'test' does not exist on type 'object'.这是否意味着object应该只用于空对象?

我想知道在typescript中声明对象变量的最佳实践是什么,因为对象的确切字段在编译时是未知的。我注意到:

代码语言:javascript
复制
const b: Record<string, any> = {
    test: 5
}

console.log(b.test)

不会导致错误。那么,是否应该首选Record类型而不是object类型呢

Typescript playground link

EN

回答 1

Stack Overflow用户

发布于 2021-01-21 17:59:49

我认为有两种解决方案:要么将该参数声明为记录,要么在运行时检查该类型,如果该参数不是对象,则抛出异常。

对于第一种方法,您可以这样做:

代码语言:javascript
复制
const doSomething = (param: Record<string, any>) => {
  // path param to another function/library
}

对于第二种方法,您可以这样做:

代码语言:javascript
复制
const doSomething = (param: any) => {
if(typeof param !== 'object') throw new Error("Not an object")
  // path param to another function/library
}

但是,我必须指出,如果这个参数来自您自己的代码之外(例如在框架中),您将不会编译该参数,因此不会出现编译时的错误。如果该对象确实是在您自己的代码中声明的,那么当代码设计良好时,通常不会遇到这种问题。

这是一个很大的缺点,你必须绕过TS类型检查,到处传播any。也许有了更多的上下文,我们可以找出设计中可以改变的地方,这样你就不必处理这个问题了:)

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65824537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档