在这种情况下:
interface IValue {a:string}
interface IFactory<T> { make():T }
class Factory{
make(): IValue { return {a: 'a'}; }
}
const b = function<T extends IValue>(factory?: IFactory<T>): T {
return factory.make() || new Factory().make(); // marked as invalid
// With error:TS2322:Type 'IValue' is not assignable to type 'T'.
};
b
函数可选择接受值工厂,或者默认情况下会生成。这是我所拥有的更复杂代码的简化示例。
我理解IValue!= T(T
显示为IValue
的孩子),但我应该如何进行协调,以期不仅可以与IValue的孩子一起工作,还可以包括精确的IValue输入自己?
答案 0 :(得分:0)
将返回结果转换为T
并进行编译。
但还有另一个错误:如果factory
无效,则会在运行时导致错误。我已经修好了。请检查以下代码。
const b = function <T extends IValue>(factory?: IFactory<T>): T {
//return factory.make() || <T>new Factory().make(); // runtime error
return <T>(factory || new Factory()).make();
};