这是否超出了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为{}
。
答案 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
但我不确定这个变种允许做什么。