Service Tokens 是唯一的标识符,提供对存储在`Container`中的值的类型安全访问。
```
import 'reflect-metadata';
import { Container, Token } from 'typedi';
export const JWT_SECRET_TOKEN = new Token<string>('MY_SECRET');
Container.set(JWT_SECRET_TOKEN, 'wow-such-secure-much-encryption');
/**
* 在JWT_SECRET_TOKEN被导入后,在应用程序的其他地方
* 导入后,可用于从容器中请求秘密。
*
* 这个值是类型安全的,因为Token是类型化的。
*/
const JWT_SECRET = Container.get(JWT_SECRET_TOKEN);
```
*****
## 注入Service Tokens
它们可以与`@Inject()`装饰器一起使用,覆盖属性或参数的推断类型。
```
import 'reflect-metadata';
import { Container, Token, Inject, Service } from 'typedi';
export const JWT_SECRET_TOKEN = new Token<string>('MY_SECRET');
Container.set(JWT_SECRET_TOKEN, 'wow-such-secure-much-encryption');
@Service()
class Example {
@Inject(JWT_SECRET_TOKEN)
myProp: string;
}
const instance = Container.get(Example);
// instance.myProp属性有为Token分配的值。
```
*****
## 同名的Token
两个具有相同名称的令牌**是不同的令牌**。这个名字只是用来帮助开发者在调试和开发过程中识别令牌。(它包括在错误信息中)。
```
import 'reflect-metadata';
import { Container, Token } from 'typedi';
const tokenA = new Token('TOKEN');
const tokenB = new Token('TOKEN');
Container.set(tokenA, 'value-A');
Container.set(tokenB, 'value-B');
const tokenValueA = Container.get(tokenA);
// tokenValueA 是 "value-A"
const tokenValueB = Container.get(tokenB);
// tokenValueB 是 "value-B"
console.log(tokenValueA === tokenValueB);
// 返回错误,因为令牌总是唯一的
```
*****
## Token和字符串标识符之间的区别
它们都实现了相同的目标,但是,建议使用`Token`,因为它们是类型安全的,不会被误输入,而误输入的字符串标识符将默默地返回`undefined `的值。