以角度方式返回方法中的Class-Value

时间:2018-02-14 09:28:46

标签: angular typescript

我想在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结构。

2 个答案:

答案 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(...)