2017-05-05 131 views
1

這是超出了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視爲{}

回答

0

事情是,extends爲泛型參數使一個非常弱的約束。

換句話說,TMorph extends Morph<T1, T2>沒有提供足夠的信息來推斷secondOptionTMorph總是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提示。

如果您確實需要在returnSecondOption中爲其參數的確切類型命名,我不知道如何進行推理。你可以嘗試

function returnSecondOptionGeneric2<TMorph, T1, T2> (morph: TMorph & Morph<T1, T2>): T2 { 
    return morph.secondOption; 
} 

但我不確定這個變種允許做什麼。

+0

'function returnSecondOption (morph:Morph ):T2' is correct。我沒有看到任何更復雜的事情是由OP中的情況所保證的。 –