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

时间:2018-03-06 12:48:51

标签: typescript

我有一个函数,在成功时返回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,但这似乎使静态类型无效。

我可以说成功,返回一个承诺,错误时返回一个字符串吗?

2 个答案:

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