Typescript 函数类型为对象或字符串,具体取决于成功或失败



我有一个函数,它在成功时返回一个承诺,在错误时返回一个字符串。

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}`;
    }
}

相关内容

最新更新