#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 (и при необходимости точная ошибка может быть уменьшена во время выполнения)