refactor: move angular source to /packages rather than modules/@angular
This commit is contained in:
67
packages/core/src/di/injection_token.ts
Normal file
67
packages/core/src/di/injection_token.ts
Normal file
@ -0,0 +1,67 @@
|
||||
/**
|
||||
* @license
|
||||
* Copyright Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by an MIT-style license that can be
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
/**
|
||||
* Creates a token that can be used in a DI Provider.
|
||||
*
|
||||
* ### Example ([live demo](http://plnkr.co/edit/Ys9ezXpj2Mnoy3Uc8KBp?p=preview))
|
||||
*
|
||||
* ```typescript
|
||||
* var t = new OpaqueToken("value");
|
||||
*
|
||||
* var injector = Injector.resolveAndCreate([
|
||||
* {provide: t, useValue: "bindingValue"}
|
||||
* ]);
|
||||
*
|
||||
* expect(injector.get(t)).toEqual("bindingValue");
|
||||
* ```
|
||||
*
|
||||
* Using an `OpaqueToken` is preferable to using strings as tokens because of possible collisions
|
||||
* caused by multiple providers using the same string as two different tokens.
|
||||
*
|
||||
* Using an `OpaqueToken` is preferable to using an `Object` as tokens because it provides better
|
||||
* error messages.
|
||||
* @deprecated since v4.0.0 because it does not support type information, use `InjectionToken<?>`
|
||||
* instead.
|
||||
*/
|
||||
export class OpaqueToken {
|
||||
constructor(protected _desc: string) {}
|
||||
|
||||
toString(): string { return `Token ${this._desc}`; }
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a token that can be used in a DI Provider.
|
||||
*
|
||||
* Use an `InjectionToken` whenever the type you are injecting is not reified (does not have a
|
||||
* runtime representation) such as when injecting an interface, callable type, array or
|
||||
* parametrized type.
|
||||
*
|
||||
* `InjectionToken` is parametrize on `T` which is the type of object which will be returned by the
|
||||
* `Injector`. This provides additional level of type safety.
|
||||
*
|
||||
* ```
|
||||
* interface MyInterface {...}
|
||||
* var myInterface = injector.get(new InjectionToken<MyInterface>('SomeToken'));
|
||||
* // myInterface is inferred to be MyInterface.
|
||||
* ```
|
||||
*
|
||||
* ### Example
|
||||
*
|
||||
* {@example core/di/ts/injector_spec.ts region='Injector'}
|
||||
*
|
||||
* @stable
|
||||
*/
|
||||
export class InjectionToken<T> extends OpaqueToken {
|
||||
// This unused property is needed here so that TS can differentiate InjectionToken from
|
||||
// OpaqueToken since otherwise they would have the same shape and be treated as equivalent.
|
||||
private _differentiate_from_OpaqueToken_structurally: any;
|
||||
constructor(desc: string) { super(desc); }
|
||||
|
||||
toString(): string { return `InjectionToken ${this._desc}`; }
|
||||
}
|
Reference in New Issue
Block a user