簡體   English   中英

打字稿子泛型類型推斷

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM