无法调用其类型缺少函数返回已解析的promise的调用签名的表达式

时间:2018-03-16 18:19:46

标签: javascript typescript promise es6-promise

我正在尝试根据某些条件调用一个使用rule A: output: "{X}.{Y}.indiv.vcf" input: "{X}.common.vcf" run: "for infile in {input}: os.system('mv '+infile+'.tmp'+' '+infile)" rule B: output: "{X}.common.vcf" input: lambda wildcards: \ expand("{X}.{Y}.vcf", **wildcards, Y=getYfromDB(wildcards["X"])) params: OUT=lambda wildcards: \ expand("{X}.{Y}.indiv.vcf.tmp", Y=getYfromDB(wildcards["X"])) shell: """ getCommonAndIndividualVariants --inputs {input} \ --common {output} --indiv {params.OUT} """ 返回已解决的承诺的函数。

该功能的过度简化版本如下:

Promise.resolve

现在TypeScript不允许它通过编译器并且抛出以下错误:

function fullFilledPromiseReturner(num: number) { if (num > 5) { return Promise.resolve(5); } else { return Promise.resolve(); } } fullFilledPromiseReturner(4).then(data => { console.log(data); }); enter image description here

我做错了什么?

1 个答案:

答案 0 :(得分:3)

问题是你的函数返回Promise<void> | Promise<number>,因为你在不同的分支上返回不同的promise类型。所以then也将是一个联合类型,你将无法调用它,因为没有一个签名是常见的。

最简单的解决方案是显式键入函数以返回联合类型的Promise而不是Promisses的联合:

function fullFilledPromiseReturner(num: number): Promise<number | void> {
    if (num > 5) {
        return Promise.resolve(5);
    } else {
        return Promise.resolve();
    }
} 
fullFilledPromiseReturner(4).then(data => {
    console.log(data);
});