如何告诉编译器这个变量不是原始值?
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
我想声明我函数的参数是对象。
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