Javascript 如何确定链中最后一个承诺的返回类型?

Javascript 如何确定链中最后一个承诺的返回类型?,javascript,typescript,promise,es6-promise,Javascript,Typescript,Promise,Es6 Promise,我想作为函数的结果返回链中的最后一个承诺。我使用的是TypeScript 1.7和本机ES6 我试过了,但是TS认为第一个承诺是返回值(Uint8Array),而不是importKey的加密密钥。我看过JavaScript示例,这些示例让我认为最后一个承诺实际上是返回值,所以TS可能只是感到困惑 private getKey(): Promise<Uint8Array> { return localforage.getItem<Uint8Array>("key")

我想作为函数的结果返回链中的最后一个承诺。我使用的是TypeScript 1.7和本机ES6

我试过了,但是TS认为第一个承诺是返回值(Uint8Array),而不是importKey的加密密钥。我看过JavaScript示例,这些示例让我认为最后一个承诺实际上是返回值,所以TS可能只是感到困惑

private getKey(): Promise<Uint8Array> {
    return localforage.getItem<Uint8Array>("key")
        .then<Uint8Array>((derivedKeyData) => {
            return crypto.subtle.importKey("raw", derivedKeyData, { name: "AES-GCM" }, false, ["decrypt"]);
        });
}
private getKey():承诺{
返回localfollow.getItem(“键”)
.然后((derivedKeyData)=>{
返回crypto.division.importKey(“raw”,derivedKeyData,{name:“AES-GCM”},false,[“decrypt”]);
});
}

如何作为函数的结果返回内部承诺?或者至少让TS相信,在不使函数的返回类型为“any”的情况下,这才是真正发生的事情?

我在上查看了您的代码,问题似乎是importKey的内置结果类型为“any”

我不知道TS,所以我只想评论一下:您立即返回
localfough.getItem
,这就是您的类型签名必须匹配的原因。为了解决这个问题,您必须使用
returnnewpromise(resolve,reject)=>…
包装整个方法体,并让
importKey
调用
resolve()
。。类似于
importKey(…).then(resolve).catch(reject)
@Matt我开始沿着这条路线走,这似乎是可行的,但后来我意识到我在下面的答案中提到的键入错误。这个答案让我找到了正确的答案-
then
的类型代表了下一个承诺的输出类型,也是函数的返回类型。所以函数实际上是在返回链中的最后一个承诺,我只是把我的类型弄错了。例如,
return localfour.getItem(“x”)。然后((forageItem)=>{return crypto.importKey(…);})
在我的例子中,这是有效的,因为即使在TS定义中,importKey返回我使用的
any
,它也是
加密密钥。