我有一个函数,它在成功时返回一个承诺,在错误时返回一个字符串。
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 或一个字符串,但这似乎使静态类型的意义无效。
我可以说成功时返回一个承诺,错误时返回一个字符串吗?
你可以告诉它结果可能是这些类型中的任何一种:
: 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);
});
这样,您无需在解析处理程序中检查债务人的类型 - 对于习惯于处理异步/承诺的人来说,它不会引起意外。
实际上,您的函数总是返回一个Promise
,因为捕获是在await
之后,它依赖于异步值,并且async
方法总是需要返回一个承诺。您需要返回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}`;
}
}