feat(di): support type literals in DI
This commit is contained in:
@ -1,5 +1,8 @@
|
||||
import {MapWrapper} from 'angular2/src/facade/collection';
|
||||
import {stringify} from 'angular2/src/facade/lang';
|
||||
import {stringify, CONST, Type} from 'angular2/src/facade/lang';
|
||||
import {TypeLiteral} from './type_literal';
|
||||
|
||||
export {TypeLiteral} from './type_literal';
|
||||
|
||||
// TODO: uncoment `int` once https://github.com/angular/angular/issues/1414 is fixed
|
||||
|
||||
@ -18,6 +21,10 @@ import {stringify} from 'angular2/src/facade/lang';
|
||||
export class Key {
|
||||
token: Object;
|
||||
id: number;
|
||||
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
constructor(token: Object, id: number) {
|
||||
this.token = token;
|
||||
this.id = id;
|
||||
@ -46,6 +53,13 @@ export class KeyRegistry {
|
||||
get(token: Object): Key {
|
||||
if (token instanceof Key) return token;
|
||||
|
||||
// TODO: workaround for https://github.com/Microsoft/TypeScript/issues/3123
|
||||
var theToken = token;
|
||||
if (token instanceof TypeLiteral) {
|
||||
theToken = token.type;
|
||||
}
|
||||
token = theToken;
|
||||
|
||||
if (MapWrapper.contains(this._allKeys, token)) {
|
||||
return MapWrapper.get(this._allKeys, token);
|
||||
}
|
||||
|
26
modules/angular2/src/di/type_literal.dart
Normal file
26
modules/angular2/src/di/type_literal.dart
Normal file
@ -0,0 +1,26 @@
|
||||
library angular2.di.type_literal;
|
||||
|
||||
/**
|
||||
* Use type literals as DI keys corresponding to generic types.
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
* ```
|
||||
* Injector.resolveAndCreate([
|
||||
* bind(new TypeLiteral<List<int>>()).toValue([1, 2, 3])
|
||||
* ]);
|
||||
*
|
||||
* class Foo {
|
||||
* // Delend on `List<int>` normally.
|
||||
* Foo(List<int> list) { ... }
|
||||
* }
|
||||
* ```
|
||||
*
|
||||
* This capability might be added to the language one day. See:
|
||||
*
|
||||
* https://code.google.com/p/dart/issues/detail?id=11923
|
||||
*/
|
||||
class TypeLiteral<T> {
|
||||
const TypeLiteral();
|
||||
Type get type => T;
|
||||
}
|
7
modules/angular2/src/di/type_literal.ts
Normal file
7
modules/angular2/src/di/type_literal.ts
Normal file
@ -0,0 +1,7 @@
|
||||
/**
|
||||
* Type literals is a Dart-only feature. This is here only so we can x-compile
|
||||
* to multiple languages.
|
||||
*/
|
||||
export class TypeLiteral {
|
||||
get type(): any { throw new Error("Type literals are only supported in Dart"); }
|
||||
}
|
Reference in New Issue
Block a user