我可以告诉TypeScript一个泛型类型具有构造函数吗?

8

我认为我可以像这样在TypeScript中创建一个泛型的新实例:

class Tree<T extends SomeInterface> {

    constructor(private elementType: {new(): T}) {
    }

    public Grow() {
        var newElement: T = new this.elementType();
        // ...
    }
}

但是有没有办法让TypeScript知道泛型中有new()?换句话说,有没有办法让以下代码正常工作?

class Tree<T extends SomeInterface> { // <-- Modify the constraint?
    public Grow() {
        var newElement: T = new T();
        // ...
    }
}

你可以在约束中使用构造函数签名类型。但是,T 是指构造函数的类型还是 new 一些值后的结果类型?在发布的示例中,你两种方式都在使用它。 - Ryan Cavanaugh
我已经收藏了这个。希望你会找到解决方案。根据文档(http://www.typescriptlang.org/Handbook#generics-generic-constraints),你不能像这样在限制中使用类型参数:"function find<T, U extends Findable<T>>(n: T, s: U) { ...". 因此,对于你的问题,暂时看来是“不行”。 - TSV
@RyanCavanaugh T旨在成为结果的类型...我想现在从你的问题中意识到new是在构造函数上调用的,而不是在“类型”上调用的。所以我想要得到我想要的结果,我需要创建某种“可创建”的接口,并给它一个Create()函数? - Eric
1个回答

8

但是有没有办法让TypeScript知道通用类型具有new()方法呢?换句话说,有没有办法让像这样的东西工作?

不完全可以。原因是你仍然需要传入将为你创建对象的实体。你不能只使用编译时约束<T>作为运行时new T

interface SomeInterface{    
}

interface SomeInterfaceConstructor<T extends SomeInterface>{
    new (): T;
}


class Tree<T extends SomeInterface> {
    constructor(private elementType: SomeInterfaceConstructor<T>) {
    }
    public Grow() {
        var newElement = new this.elementType();
        // ...
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接