1

這是有點問題昨天我在其他地方的改造。打字稿對象包裝,分型和仿製藥

我的目的不是爲了工作的結果,但有一個更好的理解這種設計在返回正確的類型,我可以得到的。通過這裏使用一個簡約的例子,所以請不要告訴我這是無用的或什麼都不做。

代碼示例(Try it in Typescript playground):

interface TestInterface { 
    test:() => {} 
} 

class Obj implements TestInterface{ 
    test() { 
     return { test: 'test' } 
    } 
} 

class Wrapper<T extends TestInterface> { 
    constructor(public obj: T) { 
    } 

    test<T>() { 
     return this.obj.test(); 
    } 

    test2<T extends TestInterface>(obj: T) { 
     return obj.test(); 
    } 
} 

let w = new Wrapper(new Obj()); 
let r1 = w.obj.test(); 
let r2 = w.test(); 
let r3 = w.test2(new Obj); 

這裏:
w具有類型Wrapper<Obj>
r1具有類型{test: string}
w.test具有類型Wrapper<Obj>.test:() => {}
r2具有類型{}
r3具有{}

這種情況是存儲在屬性對象的類的類型。它代理對這個對象的調用。

我有什麼興趣的r2返回類型。具體而言,我希望找到一種方法來返回與r1相同的類型,而不必在三條底線中指定類型。 r3是另一種測試,通過直接傳遞泛型類型。結果是一樣的。

我有一些問題:

  • 從我的理解OBJ通用有任何影響之前,Wrapper.test返回類型得到解決。因此使用其基準值(在這種情況下,{}這是TestInterface.Test的結果)。這樣對嗎?
  • 是否有目的,有些限制,未來TS版本中的一些即將發佈的功能? (沒看到任何東西)
  • ,主要,怎麼樣才能夠轉發嵌入對象的方法返回類型(或組成一個新的對象與他們),考慮到在這樣的代理,它應該有可能堵塞什麼尊重TestInterface。而且,在呼叫者(底線)處處放置泛型,我知道該怎麼做。

我在這篇文章中看到過一些對象生成器:https://github.com/Microsoft/TypeScript/pull/14141。也許這就是我要採取的方向。

回答

0

我回答自己,因爲我喜歡用#1爲我個人的筆記本電腦。如果有人有更好的答案提供,我是買家!

  • 顯然打字稿是一個很大的couchpotato和不遵循類型繼承。也許出於性能的原因,也許是因爲類型可能會受到其他方式的影響,並且不可靠,也許是因爲它很難做到,也許是因爲它尚未實現,也許是因爲沒有人要求這樣做,因爲它們不使用模型對象,或智能感知
  • 關於此問題,在Typescript 2.3的文檔/即將發佈的功能中沒有看到任何明確的內容。當使用--noImplicitThis編譯選項時,強烈鍵入thishere,並且ThisType<T>函數明確聲明this。但顯然它更多的是關於一個函數意識到它的嵌入結構類型,而不是遵循對象模型流程。這對我的情況沒有幫助。
  • 那,我可以回答!

下面是一個代碼樣品(Test it in Typescript playground):

interface TestInterface { 
    test:() => {} 
} 

class Obj implements TestInterface{ 
    test() { 
     return { test: 'test' } 
    } 
} 

class Wrapper<T extends TestInterface, TEST> { 
    public obj; 
    constructor(obj: { new(): T; prototype: { test: TEST } }) { 
     this.obj = new obj(); 
    } 

    test():TEST { 
     return this.obj.test(); 
    } 
} 

let w = new Wrapper(Obj); 
let r = w.test(); 

在這種情況下,r類型是{test: string}。這個解決方案包含沒有實例化Obj,但是得到它的原型來推斷這個類型。

在搜索時,我也用一種更簡單的方式寫出它,編號爲there(請參閱更新2)。

它提供了使用某些動態模式時保持巧妙類型和主要代碼完成的可能性。現在,它仍然是一個選擇,做或者完成一個更聰明/更清晰的設計之間做出選擇......

此示例是基於從打字稿手冊一個例子,在this page底部。

+0

是在OBJ要通過包裝被曝光的每一個公共的方法? – Daryl

+0

這將是一組定義的5種方法。所以5個泛型類型,如果我沒有找到另一種方法。也許即將到來的各種類型會有所幫助,不知道。 – arvymetal

+0

我的答案適合你嗎? – Daryl

1

我覺得this是你想要什麼:

interface TestInterface<T1,T2> { 
    test:() => T1 
    test2:() => T2 
} 

class Obj implements TestInterface<{ test: string }, { test2: number }>{ 
    test() { 
     return { test: 'test' } 
    } 

    test2() { 
     return { test2: 2 } 
    } 
} 

class Wrapper<T1,T2> implements TestInterface<T1,T2> { 
    public obj :TestInterface<T1,T2>; 
    constructor(obj: { new(): TestInterface<T1,T2> }) { 
     this.obj = new obj(); 
    } 

    test():T1 { 
     return this.obj.test(); 
    } 

    test2():T2 { 
     return this.obj.test2(); 
    } 
} 

let w = new Wrapper(Obj); 
let r = w.test(); 
let s = w.test2(); 
+0

不完全,泛型在您的解決方案中可能會有點簡化。最後我更喜歡傳遞一個實例化的對象。 要結束這個問題,以避免在Stackoverflow上只有兩個人感興趣的主題重複。 在此發佈最終答案:http://stackoverflow.com/questions/43485022/typescript-typings-generics-and-abstract-classes/43529132#43529132 – arvymetal

+0

無法刪除它... – arvymetal