接受对象或数组的TypeScript函数

接受对象或数组的TypeScript函数,typescript,Typescript,我正在尝试编写一个函数,它可以接受数组或对象,但会遇到这些冲突。如果某个对象是对象或某个属性foo是数组,我如何特别告诉TS不要查找length interface Stuff { list: [] | Obj; } interface Obj { foo: "bar" } function generateSomething(data:Stuff) { console.log(data.list.length) // Property 'length'

我正在尝试编写一个函数,它可以接受数组或对象,但会遇到这些冲突。如果某个对象是对象或某个属性
foo
是数组,我如何特别告诉TS不要查找
length

interface Stuff {
  list: [] | Obj;
}
interface Obj {
    foo: "bar"
}
function generateSomething(data:Stuff) {
    console.log(data.list.length) // Property 'length' does not exist on type 'Obj'
    console.log(data.list.foo) // Property 'foo' does not exist on type '[]'
}

您只需要在运行时帮助Typescript了解它是什么

函数生成方法(数据:Stuff){
//if(数据列表中的“长度”)
//if(数组的data.list实例)
if(!(数据列表中的“foo”){
console.log(data.list.length);
}否则{
console.log(data.list.foo);
}
}


正如Ganesh在评论中指出的,
Array.isArray(data.list)
也可以工作。

您只需要在运行时帮助Typescript了解它是什么

函数生成方法(数据:Stuff){
//if(数据列表中的“长度”)
//if(数组的data.list实例)
if(!(数据列表中的“foo”){
console.log(data.list.length);
}否则{
console.log(data.list.foo);
}
}


正如Ganesh在评论中指出的那样,
Array.isArray(data.list)
也可以工作。

您可以将变量类型为数组、字符串或对象与
typeof variable一起使用
data
变量,除非您100%确定它是数组或对象,因为否则Typescript不能保证类型安全。您可以在if语句中使用
Array.isArray(data.list)
来区分两者。您可以使用if(Array.isArray(data.list))然后检查长度侧注意:类型
[]
特别是空的;一个长度肯定为
0
的数组。在实践中,您可能需要一些更有用的东西,如
string[]
(数组的同义词)。您可以将该变量类型为数组、字符串或对象与
typeof variable
一起使用。在100%确定它是数组或对象之前,您不能使用
数据
变量,因为否则Typescript不能保证类型安全。您可以在if语句中使用
Array.isArray(data.list)
来区分两者。您可以使用if(Array.isArray(data.list))然后检查长度侧注意:类型
[]
特别是空的;一个长度肯定为
0
的数组。在实践中,您可能需要一些更有用的东西,如
string[]
(数组的同义词)。