我想在Typescript中创建方法,它返回一个类值。
例如:
getType(value :string){
switch(value){
case 'test':
return ExampleInterface.class //or .type or something like this
//... Can go on with more cases and other returnvalues
我只想这样使用它:
this.testObject.getData<getType('test')>(filter :string);
这样的事情可能吗?
其他例子:
switch(Path){
case '/testPath/':
return this.categoryRepository.getAllData<ModelInterface1>(filter,Path);
case '/testPath2/':
return this.categoryRepository.getAllData<ModelInterface2>(filter,Path);
}
我想优化这个switch-case结构。
答案 0 :(得分:2)
Typescript中的泛型使用类型擦除,因此在运行时,任何泛型参数都会丢失。您可以通过传递类构造函数来实现结果,因为它只是一个函数。这不适用于接口,因为接口只是一个编译时构造,并且没有为它们生成代码。
fun findMin (LEAF v) = v
| findMin (NODE (left, right)) = Int.min (findMin left, findMin right)
修改强>
在你的情况下,因为你调用一个带有接口的方法,无论如何都会在运行时擦除它,你可以传递任何泛型参数(满足fun findMinMax (LEAF v) = (v, v)
| findMinMax (NODE (left, right)) =
let val (minLeft, maxLeft) = findMinMax left
val (minRight, maxRight) = findMinMax right
in (Int.min (minLeft, minRight), Int.max(maxLeft, maxRight))
end
的约束。如果你什么也不做您可以拨打interface AllResults{}
class ExampleClass implements AllResults { }
function getType(value: string): new () => AllResults {
switch (value) {
case 'test':
return ExampleClass
}
throw new Error();
}
function createInstance(ctor: new () => AllResults): AllResults {
return new ctor();
}
createInstance(getType("test"))
或getAllData
答案 1 :(得分:0)
你可以用泛型来做这样的事情。
// Classes/interfaces
class One {
constructor(public name: string = 'one') {}
}
class Two {
constructor(public num: number = 2) {}
}
// your service
class MyService {
getData(path: string, rawData): One | Two {
switch (path) {
case 'one':
return this.create<One>(One, rawData);
case 'two':
return this.create<Two>(Two, rawData);
default:
return rawData; // we don't know how to handle this
}
}
// the generic method
private create<T>(c: { new(...rest: any[]): T; }, data): T {
return new c(...data);
}
}
// your "json" data.
const oneData = 'something';
const twoData = 42;
// Usage
const service = new MyService();
const oneObj = service.getData('one', oneData);
console.log(oneObj);
const twoObj = service.getData('two', twoData);
console.log(twoObj);
现在,这是一个有角度的JSON服务,我假设你想要在你的后端代码中添加一个拦截器,它只是简单地传递数据。或者像这样简单的事情:
this.backend.get(path)
.map(results => myService.getData(path, results))
.subscribe(...)