我有一个函数,在成功时返回Promise,或者在错误时返回一个字符串。
async create(createDebtorDto: CreateDebtorDto): Promise<Debtor> {
console.log("createDebtorDto", createDebtorDto)
try{
const createdDebtor = new this.debtorModel(createDebtorDto);
return await createdDebtor.save();
}catch(err){
console.log('err', err)
return `Unable to create debtor ${err}`;
}
}
当我尝试转换此代码时,出现以下错误:
src/debtors/debtors.service.ts(19,5): error TS2322: Type 'string' is not assignable to type 'Debtor'.
似乎我需要说该函数返回一个Promise或String,但这似乎使静态类型无效。
我可以说成功,返回一个承诺,错误时返回一个字符串吗?
答案 0 :(得分:3)
你可以告诉它结果可能是以下类型之一:
: Promise<Debtor | string>
但实际上,人们期望的模式是他们会正确处理错误:
async create(createDebtorDto: CreateDebtorDto): Promise<Debtor> {
console.log("createDebtorDto", createDebtorDto)
try {
const createdDebtor = new this.debtorModel(createDebtorDto);
return await createdDebtor.save();
} catch (err) {
console.log('err', err)
throw `Unable to create debtor ${err}`;
}
}
并且这样称呼:
myInstance.create(dto).then((debtor) => {
// do something with debtor...
}).catch((error) => {
alert(error);
});
这样,您就不需要在解析处理程序中检查债务人的类型 - 它不会给那些习惯处理异步/承诺的人带来意外。
答案 1 :(得分:1)
实际上你的函数总是返回一个Promise
,因为catch在await
后依赖于异步值,而async
方法总是需要返回一个promise。您需要返回Promise<Debtor| string>
,因为异步操作的结果是string
(如果出现错误)或Debtor
,如果成功。
async create(createDebtorDto: CreateDebtorDto): Promise<Debtor| string> {
console.log("createDebtorDto", createDebtorDto)
try{
const createdDebtor = new this.debtorModel(createDebtorDto);
return await createdDebtor.save();
}catch(err){
console.log('err', err)
return `Unable to create debtor ${err}`;
}
}
注意如果出现错误,返回字符串似乎是错误的设计,您可以考虑抛出异常并在调用者中捕获它。
async create(createDebtorDto: CreateDebtorDto): Promise<Debtor> {
console.log("createDebtorDto", createDebtorDto)
try{
const createdDebtor = new this.debtorModel(createDebtorDto);
return await createdDebtor.save();
}catch(err){
console.log('err', err)
throw `Unable to create debtor ${err}`;
}
}