[英]Typescript sub-generic type inference
這是否超出了TypeScript能夠做到的能力,還是我做了一件非常錯誤的事情? 這是我想要工作的一些代碼:
interface ISquare {
area: number;
}
interface ICircle {
radius: number;
}
abstract class Morph<T1, T2> {
firstOption: T1;
secondOption: T2;
}
class CircleAndSquare extends Morph<ICircle, ISquare> { }
function returnSecondOption<TMorph extends Morph<T1, T2>, T1, T2> (morph: TMorph): T2 {
return morph.secondOption;
}
returnSecondOption(new CircleAndSquare()) // adding a . here should give me intellisense for a square
智能感知應該顯示的成員ISquare
,當我把一個點在函數調用結束returnSecondOption
,但它不,它似乎看到T1和T2為{}
問題是, extends
通用參數使得一個非常弱的約束。
換句話說, TMorph extends Morph<T1, T2>
沒有提供足夠的信息來推斷secondOption
中的TMorph
總是T2
,因為例如TMorph
可以像這樣擴展:
class BadMorph extends Morph<ICircle, ISquare> {
secondOption: ISquare & { radius: string }
}
而且secondOption
實際上不再是ICircle
,因為radius
現在是number & string
,基本上等於{}
。
另一件事是, TMorph
泛型參數是不是真的有必要在returnSecondOption
,因為它是目前寫的問題,所以你可以擺脫它:
function returnSecondOption<T1, T2> (morph: Morph<T1, T2>): T2 {
return morph.secondOption;
}
無論如何,它將采用與Morph<T1, T2>
兼容的任何東西,並且推理起作用
let s = returnSecondOption(new CircleAndSquare());
在s: ISquare
playground中顯示s: ISquare
工具提示。
如果你真的需要在returnSecondOption
中為其參數的確切類型命名,我不知道如何進行推理工作。 你可以試試
function returnSecondOptionGeneric2<TMorph, T1, T2> (morph: TMorph & Morph<T1, T2>): T2 {
return morph.secondOption;
}
但我不確定這個變種允許做什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.