Typescript 泛型类型问题

问题描述 投票:0回答:1

我有这段代码,在

"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);
                            ~~~~~

任何解决此问题的建议将不胜感激。

typescript types typescript-generics angular10
1个回答
1
投票

问题

你的方法有一个泛型类型限制为

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>(...) { ... }
© www.soinside.com 2019 - 2024. All rights reserved.