Может ли условие защиты утверждений также возвращать значение? - PullRequest
1 голос
/ 15 апреля 2020

Я хочу сделать охранное предложение стиля asserts, которое также может возвращать значение. Это возможно? Вот моя мечта.

// this return type gives a compiler error
export function assertString(input: any): ((asserts input is string) & string) {
    if (typeof input != "string") throw "Expected string, got " + input;
    return input;
}

Это можно использовать гибко.

function getLength(arg: any) {
    assertString(arg);
    return arg.length;
}

// but also
function getLength2(arg: any) {
    return assertString(arg).length;
}

Возможно ли это в машинописи?

1 Ответ

2 голосов
/ 15 апреля 2020

На сегодня (15 апреля 2020 г.) ответ - нет.

Существует проблема GitHub https://github.com/microsoft/TypeScript/issues/34636

До тех пор, пока эта проблема не будет решена, вы можете использовать условный тип возврата, например, такой:

function assertString<T>(input: T): T extends string ? string : never {
    if (typeof input !== "string") throw "Expected string, got " + input;
    return (input as any);
}

enter image description here

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