簡體   English   中英

通過typescript 3.0通用rest元組類型從類tuple返回實例元組

[英]return instance tuple from classes tuple via typescript 3.0 generic rest tuples type

從類類型獲取正確的實例類型時,其工作方式如下:

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功能(常規的rest參數)獲得正確的實例類型。

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]

我們可以使它主要在3.0上運行,但是要獲得完整的元組映射支持,我們將需要等待3.1。

為了提取結果元組類型,我們可以使用映射類型和條件類型從Constructor[]提取結果類型。 這幾乎可以在3.0中使用。 在3.0中,映射類型將破壞數組類型,以便僅索引操作在結果類型上仍然可以,所有方法的類型都從不。 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@nextnpm install typescript@next ),您已經可以測試它在3.1中是否可以完全正常工作。 3.1將於2018年8月底之前的某個時間發布

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM