0

情况如下:

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 类型本身?

4

1 回答 1

0

将返回结果转换为T,它将编译。但是还有一个bug:如果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();
};
于 2017-06-28T12:22:28.267 回答