Как отделить код от типов в Typescript?

#javascript #typescript #types #typescript-typings #transpiler

#javascript #typescript #типы #typescript-типизации #transpiler

Вопрос:

Я бы хотел, вместо того, чтобы смешивать код и типы, подобные этому:

 const compar8 : boolean | error = (action: string, n: number) => {
    switch(action) {
        case 'greater':
            return n > 8;
        case 'less':
            return n < 8;
        case 'equal':
            return n === 8;
        default:
            throw new Error('Invalid action');
    }
}
  

чтобы иметь что-то вроде этого:

 // code.js

const compar8 = (action, n) => {
    switch(action) {
        case 'greater':
            return n > 8;
        case 'less':
            return n < 8;
        case 'equal':
            return n === 8;
        default:
            throw new Error('Invalid action');
    }
}

// types.ts
compar8 : (string, number) => boolean | error
  

Причина в том, что 1. более читабельно и 2. присваивать одинаковые типы определенной функции, например:

 myType = (string, number) => boolean | error
  

а затем использовать его для всех функций, которые имеют одинаковую подпись:

 // types.ts

compar8: myType
compar9: myType
...
etc
  

Есть ли способ сделать это?

Комментарии:

1. type myType = (string, number) => boolean | error будет работать просто отлично, да, тогда const compar8: myType = ... . Смотрите typescriptlang.org/docs/handbook/functions.html#function-types . Примечание const compar8 : boolean | error вообще неверно, потому что значение является функцией .

Ответ №1:

Просто объявите его как a type заранее:

 type Compar8 = (compare: string, n: number) => boolean;
const compar8: Compar8 = (compare, n) => {
    switch(action) {
        case 'greater':
            return n > 8;
        case 'less':
            return n < 8;
        case 'equal':
            return n === 8;
        default:
            throw new Error('Invalid action');
    }
}
  

Обратите внимание, что, поскольку вы не возвращаете ошибку, ее не следует включать в тип. Тип исключения, которое может быть вызвано, не указан в TypeScript. Вы бы сделали => boolean | error это, только если бы у вас было что-то вроде return new Error() . (нет throw ).

Комментарии:

1. @ entropyfever — И если хотите, тип может быть экспортирован types.ts и импортирован определяющим кодом compar8 .

2. @ CertainPerformance О возврате и отказе от выдачи ошибки, что считается лучшей практикой в Typescript? Должен ли я иметь что-то вроде: myFun: success_response | error1 | error2 | error3 или улавливать разные ошибки?

3. @entropyfever Если вам действительно нужна статическая проверка типов, чтобы различать различные возможные ошибки, вы можете это сделать, но я думаю, что это немного странно — нуждаться в такой вещи. Простого знания того, что ошибка возвращается или выдается, было бы достаточно почти во всех ситуациях IMO (и при необходимости точная ошибка может быть уменьшена во время выполнения)