1

从类类型中获取正确的实例类型时,如下所示:

type Constructor<T = {}> = new (...args: any[]) => T

class Foo {}

function getInstanceFromClass<T>(Klass: Constructor<T>): T {
  return new Klass()
}

// $ExpectType Foo
const fooInst = getInstanceFromClass(Foo)

我不知道如何使用新的 TS 3.0 功能(通用休息参数)获得正确的实例类型

class Foo {}
class Test {}

function getInstancesFromClasses<T extends Constructor[]>(...klasses: T): T { 
  return klasses.map(klass => new klass()) as any
}

// $ExpectType [typeof Foo, typeof Test]
const instances = getInstancesFromClasses(Foo,Test)

but what I need is 
// $ExpectType [Foo, Test]
4

1 回答 1

0

我们可以让它主要在 3.0 上工作,但是对于完整的元组映射支持,我们需要等待 3.1。

要提取结果元组类型,我们可以使用映射类型和条件类型从Constructor[]. 这几乎适用于 3.0。在 3.0 中,映射类型将破坏数组类型,因此在结果类型上只有索引操作仍然可以,所有方法都将是 never 类型。3.1 将使元组和数组上的映射类型按预期工作(阅读PR了解详细信息)。

type Constructor<T = {}> = new (...args: any[]) => T

class Foo {}
class Test {}

type InstanceTypes<T> = {
    [P in keyof T] :T[P] extends Constructor<infer U> ? U : never
}

function getInstancesFromClasses<T extends Constructor[]>(...klasses: T): InstanceTypes<T> { 
return klasses.map(klass => new klass()) as any
}

const instances = getInstancesFromClasses(Foo,Test)
let foo = instances[0] // is Foo
let bar = instances[1] // is Test

let [foo1, bar2] = instances // error in 3.0 since the mapped type is not really a tuple will work in 3.1

注意npm install typescript@next您已经可以通过从 npm ( )安装来测试这在 3.1 中是否完全有效。3.1 将于 2018 年 8 月结束前的某个时间发布

于 2018-08-08T09:30:54.113 回答