这有点是我昨天在其他地方发布的问题的转变。
我的目标不是获得一个工作结果,而是要更好地理解我在返回正确类型时可以获得的设计类型。这是一个极简主义的例子,所以请不要告诉我它没用或什么都不做。
代码示例(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
是另一个测试,通过直接传递泛型类型。结果是一样的。
我对此有一些疑问:
Wrapper.test
返回类型在OBJ
泛型有任何影响之前得到解决。所以使用它的基值(在这种情况下{}
是TestInterface.Test
的结果)。是不是?TestInterface
的东西。并且没有在调用者的任何地方放置泛型(在底线),我知道该怎么做。我在这篇文章中看到了一些对象构建器:https://github.com/Microsoft/TypeScript/pull/14141。也许这就是我要采取的方向。
答案 0 :(得分: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();
答案 1 :(得分:0)
我回答自己,因为我喜欢使用 Stackoverflow 作为我的个人笔记本。如果有人提供更好的答案,我就是买家!
this
编译选项和--noImplicitThis
函数明确声明ThisType<T>
时,会提到强烈输入this
here。但显然它更多的是一个函数意识到它的嵌入结构类型,而不是跟随对象模型流。在我的情况下它没有用。以下是代码示例(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(参见 update 2 )。
它提供了在使用某些动态模式时保持聪明的打字和主要代码完成的可能性。现在,它仍然可以选择完成或更智能/更清晰的设计...
此示例基于this page底部的 Typescript手册中的示例。