Typescript 类型脚本:类型参数的类型参数';R';无法从用法中推断

Typescript 类型脚本:类型参数的类型参数';R';无法从用法中推断,typescript,promise,es6-promise,typescript1.6,Typescript,Promise,Es6 Promise,Typescript1.6,对于TypeScript 1.6和本机es6 Promises,每当我使用带有两种不同返回类型的Promise.all([])时,我都会收到一个错误。例如: let onePromise:Promise<string[]> = getOne(); let twoPromise:Promise<MyObject> = getTwo(); Promise.all([onePromise, twoPromise]) .then((values:[string[], M

对于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
    });
letonepromise:Promise=getOne();
让两个承诺:承诺=getTwo();
承诺。所有([一个承诺,两个承诺])
.然后((值:[string[],MyObject])=>{
设一:字符串[]=值[0];
设二:MyObject=value[1];
//做事
});
在该示例中,我在TypeScript编译器的
Promise.all
行上得到一个错误
错误TS2453:无法从用法推断类型参数“R”的类型参数。考虑显式指定类型参数。类型参数候选“string[]”不是有效的类型参数,因为它不是候选“MyObject”的超类型。类型“MyObject”中缺少属性“length”。


实际上我还有另一个例子,错误的第二句和第三句是不同的,但第一句是相同的。所以基本上我想知道“显式指定类型参数”的语法是什么。我似乎不明白。代码运行正常,但我想消除此transpiler警告。

我只知道此解决方法:

///<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
    });
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
    });
///
类MyObject{}
让我们承诺:承诺=无效;
让我们承诺:承诺=无效;
承诺。所有([一个承诺,两个承诺])
。然后((数据:任意)=>{
let值:[string[],MyObject]=数据;
设一=值[0];
设两个=值[1];
//做事
});
这里有一个解决方法:

///<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
    });
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
    });
letonepromise:Promise=getOne();
让两个承诺:承诺=getTwo();
承诺。所有([一个承诺,两个承诺])
.然后((值:[string[],MyObject])=>{
设一:字符串[]=值[0];
设二:MyObject=value[1];
//做事
});

垂直条用于指定可以是多种类型之一的值。

我实际上更喜欢它,因为它有打字功能。由于
Promise.all
将数组
Promise[]
转换为
Promise
,因此可以使用联合类型指定
T
是什么。因此,我们可以定义
typet=string[]| MyObject
,使代码更清晰