打字稿对象包装,分型和仿制药

问题描述:

这是有点问题昨天我在其他地方的改造。打字稿对象包装,分型和仿制药

我的目的不是为了工作的结果,但有一个更好的理解这种设计在返回正确的类型,我可以得到的。通过这里使用一个简约的例子,所以请不要告诉我这是无用的或什么都不做。

代码示例(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。也许这就是我要采取的方向。

我回答自己,因为我喜欢用#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

我觉得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