2017-10-24 12 views
0

文字列を関数に渡し、返される動的型を割り当てることはできますか?動的戻り型文字列に基づく型

class MyService { 
    aMethod(arg) { 
    console.log(arg) 
    } 
} 

Container.register('my_service', MyService); 

// Internally Container holds a Object 
export interface IServiceInstance { 
    name: string; 
    type: Function; 
    instance: Object; 
} 

const myServiceInstance = Container.get('my_service') 

// myServiceInstance should be detected as type of MyService class 
myServiceInstance.aMethod('Hello World') 

// Currently I use it like this. But if it is possible I want to get rid of that 
const myServiceInstance = (Container.get('my_service') as MyService) 
+0

「コンテナ」とは、ジェネリック型をサポートしていますか? 'Container.get ( 'my_service')'などです。あなたは*どこか*のタイプについて特定しなければなりません。 – jonrsharpe

+0

Isn't 'Container.get ( 'my_service')' '(MyServiceでとしてContainer.get( 'my_service'))' – dtomasi

+1

、同じ効果を持つとまったく同じ。 TSは魔法ではない。もう一度、*どこかに*を指定する必要があります。 – jonrsharpe

答えて

0

あなたは定数文字列でメソッド特殊化を追加するために容器の種類を拡張することができる:

// In a library for example 
declare class ContainerClass { 
    register<T>(name: string, ctor: new()=> T): void; 
    get (name: string) : any; 
} 
let Container: ContainerClass ; 


// In your app 
class MyService { 
    aMethod(arg) { 
     console.log(arg) 
    } 
    } 

Container.register('my_service', MyService); 
interface ContainerClass { 
    get (name: 'my_service') : MyService; 
} 
Container.get('my_service').aMethod(""); 

これはタイプ(インターフェースまたはクラス)を宣言することによって拡張することができるという事実を利用します同じ名前空間と同じ名前のインターフェイス。

+0

うーん..私が望んでいるように見えるのは本当に可能ではない。私の望みは、getメソッドは、レジスタ関数の入力に基づいて正しい型を返すということです。 – dtomasi

+1

これを行うには、追加の宣言を追加する必要があります。自動的には発生しません。しかし、これを頻繁に使用すると、登録するタイプごとにメソッドを追加するのはそれほど大きな問題ではありません –

関連する問題