Общий синтаксис определения обещания TypeScript - PullRequest
1 голос
/ 06 июня 2019

Я не совсем понимаю Promise определение TypeScript, как показано ниже:

/**
 * Represents the completion of an asynchronous operation
 */
interface Promise<T> {
    /**
     * Attaches callbacks for the resolution and/or rejection of the Promise.
     * @param onfulfilled The callback to execute when the Promise is resolved.
     * @param onrejected The callback to execute when the Promise is rejected.
     * @returns A Promise for the completion of which ever callback is executed.
     */
    then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): Promise<TResult1 | TResult2>;

    /**
     * Attaches a callback for only the rejection of the Promise.
     * @param onrejected The callback to execute when the Promise is rejected.
     * @returns A Promise for the completion of the callback.
     */
    catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null): Promise<T | TResult>;
}

Я думаю, then<TResult1 = T, TResult2 = never> означает, что then имеет два универсальных типа, которые TResult1 и TResult2TResult1 будет T, если не указано иное.

Но оказывается, что TResult1 изменится в соответствии с return type из onfulfilled.См. Демонстрацию:

interface Result {
    status: number;
    message: string;
}

function foo() {
    return new Promise<Result>(function (resolve, reject) {
        resolve({
            status: 0,
            message: 'ok',
        });
     });
}

// here fulfilled1's type is: (local function) fulfilled(out: Result): number
foo().then(function fulfilled1(out) { 
    if (Math.random() > 0.5) {
        return 1;
    }
});
// here fullfilled2's type is: (local function) fulfilled2(out: Result): string
foo().then(function fulfilled2(out) { 
    if (Math.random() > 0.5) {
        return 'hello';
    }
});

и fulfilled1 и fulfilled2 соответствует then<TResult1 = T, TResult2 = never>.Но так как я не определяю then универсальные типы, я думал, что TResult1 будет Result в приведенном выше коде, в то время как на лице TResul1 становится number и string в этих случаях.

Может быть, я что-то не так с TypeScript generic.Любые идеи приветствуются.

1 Ответ

1 голос
/ 06 июня 2019

Значение по умолчанию будет использоваться, если для TResult1 невозможно сделать вывод.В этом случае можно сделать вывод на основе переданной вами функции. Поскольку оба параметра then помечены как необязательные, это будет допустимый вызов и вызовет значение по умолчанию:

 foo().then() // returns a promise with TResult1

Или более полезный пример, передавая только второй аргумент, снова TResult1 использует значение по умолчанию.

 var r = foo().then(undefined, r => "ERR"); // Promise<string | Result>

Если вы передадите функцию, эта функция может изменить тип возвращаемого обещания, иЯ думаю, что именно так большинство людей используют обещания, выполняют асинхронный вызов, обрабатывают результат, возвращают что-то еще в качестве следующего результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...