TypeScript: аргумент типа для параметра типа «R» не может быть выведен из использования

С TypeScript 1.6 и собственными обещаниями es6 я получаю сообщение об ошибке всякий раз, когда использую 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
    });

В этом примере я получаю ошибку в строке Promise.all от компилятора 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'.

На самом деле у меня есть еще один пример этого, где второе и третье предложения ошибки разные, но первое предложение такое же. Так что в основном мне интересно, что такое синтаксис для «явного указания аргументов типа». Я не могу понять это. Код работает нормально, но я хотел бы избавиться от этого предупреждения транспилятора.


person cjbarth    schedule 26.11.2015    source источник


Ответы (2)


Вот обходной путь:

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

Вертикальная черта используется для указания значения, которое может быть одного из нескольких типов.

person Leor    schedule 29.07.2016
comment
На самом деле мне это нравится больше, потому что у него есть типизация. Поскольку Promise.all преобразует массив Promise<T>[] в Promise<T[]>, имеет смысл указать, что такое T, используя тип объединения. Таким образом, мы могли бы определить type T = string[] | MyObject, чтобы сделать код более понятным. - person Bruno Grieder; 29.07.2016

Я знаю только об этом обходном пути:

///<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
    });
person Martin Vseticka    schedule 27.11.2015