【问题标题】:TypeScript: Type Argument for type parameter 'R' cannot be inferred from the usageTypeScript:类型参数“R”的类型参数不能从用法中推断出来
【发布时间】:2016-02-29 23:46:14
【问题描述】:

对于 TypeScript 1.6 和本机 es6 Promises,每当我使用具有两种不同返回类型的 Promise.all([]) 时,都会出现错误。例如:

let onePromise:Promise<string[]> = getOne();
let twoPromise:Promise<MyObject> = getTwo();

Promise.all([onePromise, twoPromise])
    .then((values:[string[], MyObject]) => {
        let one:string[] = values[0];
        let two:MyObject = values[1];

        // do stuff
    });

在该示例中,我在 TypeScript 编译器 error TS2453: The type argument for type parameter 'R' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate 'string[]' is not a valid type argument because it is not a supertype of candidate 'MyObject'. Property 'length' is missing in type 'MyObject'.Promise.all 行上收到错误

我实际上还有另一个例子,错误的第二句和第三句不同,但第一句是相同的。所以基本上我想知道“明确指定类型参数”的语法是什么。我似乎无法弄清楚。代码运行良好,但我想摆脱这个编译器警告。

【问题讨论】:

    标签: typescript promise es6-promise typescript1.6


    【解决方案1】:

    这里有一个解决方法:

    let onePromise:Promise<string[]> = getOne();
    let twoPromise:Promise<MyObject> = getTwo();
    
    Promise.all<string[] | MyObject>([onePromise, twoPromise])
        .then((values:[string[], MyObject]) => {
            let one:string[] = values[0];
            let two:MyObject = values[1];
    
            // do stuff
        });
    

    竖线用于指定可以是多种类型之一的值。

    【讨论】:

    • 我其实更喜欢这个,因为它有分型。由于Promise.all 将数组Promise&lt;T&gt;[] 转换为Promise&lt;T[]&gt;,因此使用联合类型指定T 是有意义的。所以我们可以定义type T = string[] | MyObject让代码更清晰
    【解决方案2】:

    我只知道这个解决方法:

    ///<reference path="typings/es6-promise/es6-promise.d.ts" />
    
    class MyObject {}
    
    let onePromise:Promise<string[]> = null;
    let twoPromise:Promise<MyObject> = null;
    
    Promise.all([onePromise, twoPromise])
        .then((data:any) => {
            let values:[string[],MyObject] = data;
    
            let one = values[0];
            let two = values[1];
    
            // do stuff
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-01
      • 1970-01-01
      相关资源
      最近更新 更多