![](/img/trans.png)
[英]TypeScript: How to obtain return type of the instance of a generic function that has a specified parameter tuple type?
[英]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@next
( npm install typescript@next
),您已經可以測試它在3.1中是否可以完全正常工作。 3.1將於2018年8月底之前的某個時間發布
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.