首页 > 解决方案 > typescript 中的什么类型应该用于在编译时字段未知的对象?

问题描述

我有以下功能:

const doSomething = (param: object) => {
  // path param to another function/library
}

关键是我知道(并且想要强制执行)这param是一个对象,而不是原始类型。在 typescript中object 完成了这个角色。

但是我注意到:

const a: object = {
  test: 5
}
console.log(a.test)

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

我想知道在编译时不知道对象的确切字段的打字稿中声明对象变量的最佳做法是什么。我注意到:

const b: Record<string, any> = {
    test: 5
}

console.log(b.test)

不会导致错误。那么应该Record首选 type 而不是object?

打字稿游乐场链接

标签: typescripttypes

解决方案


我认为对此的两种解决方案可能是将参数声明为记录,或者在运行时检查类型并在参数不是对象时抛出异常。

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

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。也许有了更多的上下文,我们可以找出设计中可以改变的地方,这样你就不必处理这个了:)


推荐阅读