当我使用 Angular 的依赖注入时,我失去了打字的能力。我不知道为什么?有人可以解释并找到在严格输入的同时使用 DI 的解决方案吗?我正在使用一项服务来严格键入本地存储,这里有一些上下文:
我使用具有泛型类型的类。
@Injectable()
export class LocalStorageService<T> implements iStorageService<T> {
// ...
constructor(@Inject(LOCAL_STORAGE_NAMESPACE) private namespace: string) {}
set<K extends keyof T>(key: K, value: T[K]) {
if (this.storage) {
this.storage.setItem(
this.namespace + key.toString(),
JSON.stringify(value)
);
}
}
// ...
}
在消费者层面:
providers: [
{
provide: LOCAL_STORAGE_NAMESPACE,
useValue: 'dumbnamespace',
},
LocalStorageService<LocalStorageModel>,
],
我也尝试过:
providers: [
{
provide: 'LocalStorageService',
useFactory: () => new LocalStorageService<LocalStorageModel>('namespace'),
},
],
使用本地存储模型:
interface LocalStorageModel {
[LocalStorageKey.Name]: string;
}
在组件中:
private testTypeChecking = inject(LocalStorageService).set(LocalStorageKey.City, 22);
这里应该没有错误:(
这样做是可行的(我们有一个错误,数字不是字符串),但不使用 Angular 的 DI。
const testTypeChecking = () => {
const localStorageService = new LocalStorageService<LocalStorageModel>('id');
localStorageService.set(LocalStorageKey.Name, 22);
};
有没有人解释一下?
这是因为未指定通用参数,所以这是预期的😅
private localStorage = inject<LocalStorageService<LocalStorageModel>>(LocalStorageService<LocalStorageModel>)
// VS
constructor(private localStorage: LocalStorageService<LocalStorageModel>) {}