打字稿子泛型类型推断

时间:2017-05-05 22:43:21

标签: typescript typescript-generics

这是否超出了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的函数调用结束时放置一个点时,intellisense应显示returnSecondOption的成员,但它没有,它似乎看到T1和T2为{}

1 个答案:

答案 0 :(得分:0)

问题是,$('body').trigger('takeMeToDinner'); 对于泛型参数会产生一个非常弱的约束。

换句话说,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>
在typescript playground中的

显示let s = returnSecondOption(new CircleAndSquare()); 工具提示。

如果您确实需要在s: ISquare中找到其参数的确切类型,我就不知道如何进行推理工作。你可以尝试

returnSecondOption

但我不确定这个变种允许做什么。