如何告诉编译器此变量不是原始值?

时间:2019-02-14 11:58:33

标签: typescript tsc

我想声明我函数的args是对象。

function foo(obj1: object, obj2: object){
  obj1.name = 'foo'
  obj2[MAYBE_ANY_PROPERTIES] = 'bar'
}

但是当我尝试编译时,tsc告诉Property 'name' does not exist on type '{}'

我理解此错误,但是无论如何,我想告诉编译器obj1是一个可以具有任何属性的对象,但是它永远不能是原始值。我该怎么办?

1 个答案:

答案 0 :(得分:5)

如果希望对象可索引,则需要一个string索引。您可以使用Record类型来获得这种效果:

function foo(obj1: Record<string, any>, obj2: Record<string, any>){
  obj1.name = 'foo'
}

foo(1, 2) //err
foo("", "") // err

foo({ name: "" }, { name: "" }) // ok

如果您的对象必须包含特定属性,则可以考虑使用更严格的类型:

function foo(obj1: {name: string } & Record<string, any>, obj2: {name: string } & Record<string, any>) {
  obj1.name = 'foo'
}

foo({ name: "" }, { name_: "" }) // error no name