我有这段代码,在
"typescript": "3.8.3"
中运行良好
升级到 Angular 10 和 "typescript": "4.0.8"
后,我看到一些打字稿错误:
handleEventResponse<T extends any>(event: CustomEvent, { resolve, reject }): T {
let response: T = {} as T;
if (Array.isArray(event.data)) {
response = event.data as any;
resolve(response);
} else {
Object.assign(response, event.data);
if (response.status === 'ok') {
resolve(response);
} else {
reject(response.error);
}
}
return response;
}
出现这些编译错误:
Compiling TypeScript sources through ngc
ERROR: src/lib/services/custom-events.service.ts:3
362 if (response.status === 'ok') {
~~~~~~
src/lib/services/custom-events.service.ts:365:25 -
365 reject(response.error);
~~~~~
任何解决此问题的建议将不胜感激。
你的方法有一个泛型类型限制为
any
:
handleEventResponse<T extends any>(...) { ... }
在 TypeScript 3.9 中引入了以下更改:
扩展
的类型参数不再充当any
any
在 TypeScript 的早期版本中,限制为
的类型参数可以被视为any
。any
function foo<T extends any>(arg: T) { arg.spfjgerijghoied; // no error! }
这是一个疏忽,因此 TypeScript 3.9 采用了更保守的方法,并对这些有问题的操作发出错误。
function foo<T extends any>(arg: T) { arg.spfjgerijghoied; // ~~~~~~~~~~~~~~~ // Property 'spfjgerijghoied' does not exist on type 'T'. }
这会导致
T
被视为 unknown
。您无法对键入为 unknown
的值执行任何操作,因为它不是类型安全的。在您的代码中,无法保证 status
或 error
可用。
您需要告诉 TypeScript
status
和 error
可能在类型 T
上可用。一个例子:
interface Response {
status: <your type>;
error: <your type>;
}
handleEventResponse<T extends Response>(...) { ... }