Typescript 如何告诉编译器此变量不是基元值?

Typescript 如何告诉编译器此变量不是基元值?,typescript,tsc,Typescript,Tsc,我想声明函数的参数是对象 function foo(obj1: object, obj2: object){ obj1.name = 'foo' obj2[MAYBE_ANY_PROPERTIES] = 'bar' } 但当我尝试编译时,tsc告诉我类型“{}”上不存在属性“name” 我理解这个错误,但无论如何,我想告诉编译器obj1是一个可能有任何属性的对象,但它永远不应该是一个基元值。我该怎么做?如果希望对象可索引,则需要字符串索引。您可以使用记录类型来获得该效果: functi

我想声明函数的参数是对象

function foo(obj1: object, obj2: object){
  obj1.name = 'foo'
  obj2[MAYBE_ANY_PROPERTIES] = 'bar'
}
但当我尝试编译时,tsc告诉我类型“{}”上不存在属性“name”


我理解这个错误,但无论如何,我想告诉编译器obj1是一个可能有任何属性的对象,但它永远不应该是一个基元值。我该怎么做?

如果希望对象可索引,则需要字符串索引。您可以使用记录类型来获得该效果:

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

如果希望对象可索引,则需要字符串索引。您可以使用记录类型来获得该效果:

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
简单地写:obj1.name='foo'简单地写:obj1.name='foo'