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

How to tell compiler that this variable is not a primitive value?

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

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

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

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

如果希望对象可索引,则需要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