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 `的值。