我有一个TypeScript错误消息,它的错误我不明白。错误信息是:
error TS2345:类型为‘(错误:错误)的参数’(错误:错误),=> void \答应‘不能分配给类型的参数’(原因: any) =>,IdentityKeyPair,of,PromiseLike‘。键入'void \答应‘不能指定键入'IdentityKeyPair \ PromiseLike’。
我的代码运行良好,但当我更改这个块时,TypeScript对我很生气:
.catch((error) => {
let identity: Proteus.keys.IdentityKeyPair = Proteus.keys.IdentityKeyPair.new();
return this.store.save_identity(identity);
})
这方面:
.catch((error) => {
if (error instanceof RecordNotFoundError) {
let identity: Proteus.keys.IdentityKeyPair = Proteus.keys.IdentityKeyPair.new();
return this.store.save_identity(identity);
} else {
return reject(error);
}
})
下面是正在工作的完整代码:
public init(): Promise<Array<Proteus.keys.PreKey>> {
return new Promise((resolve, reject) => {
this.store.load_identity()
.catch((error) => {
let identity: Proteus.keys.IdentityKeyPair = Proteus.keys.IdentityKeyPair.new();
return this.store.save_identity(identity);
})
.then((identity: Proteus.keys.IdentityKeyPair) => {
this.identity = identity;
return this.store.load_prekey(Proteus.keys.PreKey.MAX_PREKEY_ID);
})
.then((lastResortPreKey: Proteus.keys.PreKey) => {
return resolve(lastResortPreKey);
})
.catch(reject);
});
}
下面是不再编译的代码:
public init(): Promise<Array<Proteus.keys.PreKey>> {
return new Promise((resolve, reject) => {
this.store.load_identity()
.catch((error) => {
if (error instanceof RecordNotFoundError) {
let identity: Proteus.keys.IdentityKeyPair = Proteus.keys.IdentityKeyPair.new();
return this.store.save_identity(identity);
} else {
return reject(error);
}
})
.then((identity: Proteus.keys.IdentityKeyPair) => {
this.identity = identity;
return this.store.load_prekey(Proteus.keys.PreKey.MAX_PREKEY_ID);
})
.then((lastResortPreKey: Proteus.keys.PreKey) => {
return resolve(lastResortPreKey);
})
.catch(reject);
});
}
有人知道为什么TypeScript编译器拒绝使用错误代码TS2345
的return reject(error);
语句吗?
截图:
我使用的是TypeScript 2.1.4。
发布于 2017-01-12 16:32:21
下面试一试。当您在一个时间或捕获块时,您可以返回一个承诺或一个值,这些承诺或值被包装成一个承诺。您是自己手动处理承诺的,因此您只需调用决心并拒绝处理程序,而不需要返回任何内容。返回reject(error)
将尝试获取返回的值,将其包装在一个承诺中,然后尝试传递到下一个then
块,这就是为什么要得到所做的错误。可以这样想:在处理程序中返回某些内容意味着继续使用这个新值。在您的情况下,我认为您只是想停止链接,并有承诺,您正在创造的决心或拒绝在特定的条件。
public init(): Promise<Array<Proteus.keys.PreKey>> {
return new Promise((resolve, reject) => {
this.store.load_identity()
.catch((error) => {
if (error instanceof RecordNotFoundError) {
let identity: Proteus.keys.IdentityKeyPair = Proteus.keys.IdentityKeyPair.new();
return this.store.save_identity(identity);
} else {
throw error;
}
})
.then((identity: Proteus.keys.IdentityKeyPair) => {
this.identity = identity;
return this.store.load_prekey(Proteus.keys.PreKey.MAX_PREKEY_ID);
})
.then((lastResortPreKey: Proteus.keys.PreKey) => {
resolve(lastResortPreKey);
})
.catch((error) => {
reject(error);
});
});
}
发布于 2017-01-12 22:03:16
您无法阻止承诺链(取消除外),甚至不能通过return
ning reject()
来阻止承诺链,这显然是对承诺的滥用(您不应该将承诺包装在另一个承诺构造器中)。
让我们从你能做的开始,然后去做你应该做的事情。
您可以让拒绝冒泡掉下承诺链,当它与类型保护不匹配时再对其进行throw
处理,在行的底部,在所有的.catch()
子句都耗尽了自己之后,函数返回的承诺将被拒绝。
现在
考虑一下如何在同步代码中这样做。你会有这样的东西:
try {
try {
actionThatThrows();
} catch (err) {
breakEverything();
}
continue other steps
} catch(err) {
generalErrorHandling();
}
这种代码是不好的,在承诺中也是不行的。您应该将不同的操作移动到可以自行解决或拒绝的函数中,使用错误的含义,这是一个异常,它会在堆栈上出现气泡,直到它遇到能够处理它的东西为止。
另外,由于您使用的是TS 2.1.x,对于长异步流,建议使用异步函数。
发布于 2017-01-12 16:31:37
您的返回在那里是无用的,它是onRejection回调的结束。并且返回reject()将履行下一个.then()承诺。但是,如果您抛出错误,它将在下面的承诺中继承到.catch(拒绝);
基本上:在任何捕获/然后,返回将解决儿童的承诺,并抛出将拒绝儿童的承诺。
我重写了您的代码,以获得更好的承诺链流。
public init(): Promise<Array<Proteus.keys.PreKey>> {
return new Promise((resolve, reject) => {
this.store.load_identity()
.catch(
(error) => {
if (error instanceof RecordNotFoundError) {
let identity: Proteus.keys.IdentityKeyPair = Proteus.keys.IdentityKeyPair.new();
return this.store.save_identity(identity);
} else {
throw error;
}
}
)
.then(
(identity: Proteus.keys.IdentityKeyPair) => {
this.identity = identity;
resolve(this.store.load_prekey(Proteus.keys.PreKey.MAX_PREKEY_ID));
},
reject
)
});
}
https://stackoverflow.com/questions/41618064
复制相似问题