Promise 回调参数类型不可分配给 '(value: unknown) => void | PromiseLike<void>'

Posted

技术标签:

【中文标题】Promise 回调参数类型不可分配给 \'(value: unknown) => void | PromiseLike<void>\'【英文标题】:Promise callback parameter type not assignable to '(value: unknown) => void | PromiseLike<void>'Promise 回调参数类型不可分配给 '(value: unknown) => void | PromiseLike<void>' 【发布时间】:2021-09-06 02:16:53 【问题描述】:

Typescript 不喜欢我的then 回调的参数类型:

Argument of type '(value: T) => void' is not assignable to parameter of 
type '(value: unknown) => void | PromiseLike<void>'.
  Types of parameters 'T' and 'value' are incompatible.
    Type 'unknown' is not assignable to type 'T'.

【问题讨论】:

显然this.booksServices.getSingleBook(你没有显示)返回一个Promise&lt;unknown&gt;,所以不能保证你会得到一个Book。请给minimal reproducible example作为文本 @jonrsharpe 我刚刚用 booksServices.getSingleBook 的代码编辑了这个问题 作为截图。代码是文本,就这样发布。但是,是的,该函数缺少任何关于它可能返回的承诺 of 的信息。 【参考方案1】:

有一个difference between any and unknown

简而言之,您不能像在代码中那样将unknown 视为anything 或Book。 如果您的方法返回Promise&lt;any&gt;Promise&lt;Book&gt;,您将能够执行您在此处尝试的操作。

我会选择后者并像这样注释 getSingleBook 方法:

getSingleBook(id: number): Promise<Book> 
//...
const potentialBook = data.val();
const book: Book = validateBook(potentialBook); // throw an error if not a book
resolve(book);
//...

如果您 100% 确定它是并且将永远是,那么您可以将解析的值断言为一本书,但这是不建议的:

getSingleBook(id: number): Promise<Book> 
//...
resolve(book as Book);
//...

谢谢jonrsharpe。

【讨论】:

这只是解决了问题,因为根本问题是getSingleBook 返回Promise&lt;Book&gt;unknown 仍然不能分配给Book :typescriptlang.org/play?#code/…

以上是关于Promise 回调参数类型不可分配给 '(value: unknown) => void | PromiseLike<void>'的主要内容,如果未能解决你的问题,请参考以下文章

promise + redux + redux-thunk:打字稿错误“不可分配给类型'Promise<any>”

反应类型错误“不可分配给'从不'类型的参数”

“header:Header;”类型的参数不可分配给“RequestOptionsArgs”类型的参数

构建:'string | 类型的参数1' 不可分配给“字符串”类型的参数

构建:'string | 类型的参数1' 不可分配给“字符串”类型的参数

PhpStorm 警告:参数类型不可分配给参数类型