Введите проверочные строки вместо использования instanceof - PullRequest
0 голосов
/ 04 июля 2018

Скажем, у меня есть библиотека, которая выполняет TCP, и ответ может быть разным, некоторые ответы представляют ошибки.

Нет смысла использовать объект Error, потому что это дорого, но трассировка стека не имеет ничего общего с исходным запросом, так как ошибка, как это должно было произойти, могла бы произойти асинхронно.

Так что лучшее, что я могу придумать, это простая строка, что-то вроде:

const makeRequest = function(err, result){

    if(err && err.code === 'Request timeout'){

    }

    if(err && err.code === 'Unauthorized'){

    }
};

Как разрешить пользователям печатать строку с помощью TypeScript?

1 Ответ

0 голосов
/ 04 июля 2018

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

interface CustomError {
    code:'Request timeout' | 'Unauthorized'
}

const makeRequest = function(err : CustomError | null, result : any){
    if(err && err.code === 'Not an error'){ // This would be an error

    }
    if(err && err.code === 'Request timeout'){

    }

    if(err && err.code === 'Unauthorized'){

    }
};

Если каждый тип ошибки содержит дополнительную информацию, которую вы хотите предоставить, вы также можете комбинировать строковые литеральные типы с дискриминационным объединением:

interface TimoutoutError {
    code: 'Request timeout'
    time: number;
}

interface UnauthorizedError {
    code: 'Unauthorized'
    user: string;
}

type CustomError = TimoutoutError | UnauthorizedError;

const makeRequest = function (err: CustomError | null, result: any) {
    if (err && err.code === 'Not an error') { // This would be an error

    }
    if (err && err.code === 'Request timeout') {
        err.time; // err is TimoutoutError
    }

    if (err && err.code === 'Unauthorized') {
        err.user // err is UnauthorizedError
    }
};
...