在Typescript中使用泛型数组进行类型推断 //通用约束 班车{ 打印(){ console.log(“我是一辆车”) } } 班房{ 打印(){ console.log(“我是一座房子”) } } 接口可打印{ print():无效; } //告诉Typescript我保证T类型将满足可打印接口 函数printHousesOrCars(…arr:T[]):void{ arr.forEach(item=>item.print()) } printHousesOrCars(1,2,3)//我能理解这行出错了 Printhouse Sorcars(new House(),new Car())//这行字体脚本推断T[]是车[],我不明白,为什么不应该是(House | Car)[]

在Typescript中使用泛型数组进行类型推断 //通用约束 班车{ 打印(){ console.log(“我是一辆车”) } } 班房{ 打印(){ console.log(“我是一座房子”) } } 接口可打印{ print():无效; } //告诉Typescript我保证T类型将满足可打印接口 函数printHousesOrCars(…arr:T[]):void{ arr.forEach(item=>item.print()) } printHousesOrCars(1,2,3)//我能理解这行出错了 Printhouse Sorcars(new House(),new Car())//这行字体脚本推断T[]是车[],我不明白,为什么不应该是(House | Car)[],typescript,generics,type-inference,typescript-generics,Typescript,Generics,Type Inference,Typescript Generics,我听不懂最后一行,如果我写了 const x=[new House(),new Car()]//Typescript将推断x为(House | Car)[] 下面的行将由Typescript解释为类型为[House,Car]的两元素元组 const x=[new House(),new Car()]//Typescript将推断x为(House | Car)[ 我知道这有点令人困惑,因为两者都使用相同的语法,即[和] 现在您可以稍微修改函数签名,以便生成我认为更正确的键入 function pr

我听不懂最后一行,如果我写了

const x=[new House(),new Car()]//Typescript将推断x为(House | Car)[]


下面的行将由Typescript解释为类型为[House,Car]的两元素元组

const x=[new House(),new Car()]//Typescript将推断x为(House | Car)[

我知道这有点令人困惑,因为两者都使用相同的语法,即
[
]

现在您可以稍微修改函数签名,以便生成我认为更正确的键入

function printHousesOrCars<T extends Printable[]>(...arr: T): void {
  arr.forEach(item => item.print())
}


我希望这是有道理的

Typescript将以下行解释为类型为[House,Car]的两元素元组

const x=[new House(),new Car()]//Typescript将推断x为(House | Car)[

我知道这有点令人困惑,因为两者都使用相同的语法,即
[
]

现在您可以稍微修改函数签名,以便生成我认为更正确的键入

function printHousesOrCars<T extends Printable[]>(...arr: T): void {
  arr.forEach(item => item.print())
}


我希望这是有道理的

您的
House
Car
具有相同的类型,因此编译器将它们视为相同的类型。例如,您应该通过添加不兼容的属性,例如将
制造商
属性添加到
汽车
,将
numBathrooms
属性添加到
房屋
。如果将函数更改为:
函数printHousesOrCars(…arr:T):void怎么办{//etc.
?@jcalz谢谢,这真的很有帮助。这是否意味着使用genrics,TS不会推断该类型为联合类型,它必须是特定类型。@flavio不起作用,兄弟,那么t[]是二维的array@crazyones110它不局限于2D数组。数组的长度实际上取决于调用函数的方式。如果用10个参数调用它,它将推断出一个包含10个iten的元组。你的
House
Car
具有相同的类型,因此编译器将它们视为相同的类型。你应该,比如说,添加不兼容tible属性,如
制造商
属性到
汽车
numBathrooms
属性到
房屋
。如果将函数更改为:
函数printHousesOrCars(…arr:T):无效{//etc.
?@jcalz谢谢,这真的很有帮助。这是否意味着使用genrics,TS不会推断该类型为联合类型,它必须是特定类型。@flavio不起作用,兄弟,那么t[]是二维的array@crazyones110它不限于2D数组。数组的长度实际上取决于调用函数的方式。如果使用10个参数调用它,它将推断为一个包含10个iten的元组。你是说所有联合类型数组都将被解释为元组?比如
const y=[1,true,'hello']
。实际上它是光标悬停时,[number,boolean,string]元组而不是(number | boolean | string)[]Typescript将
(number | boolean | string)[/code>视为元组的表示法以简化操作?您的意思是所有联合类型数组都将被解释为元组?例如
常量y=[1,true,'hello']
。实际上它是[number,boolean,string]当光标悬停时,tuple而不是(number | boolean | string)[]为简单起见,Typescript将
(number | boolean | string)[]
作为tuple的表示法?