Фон
Пытаясь проникнуться духом TypeScript, я пишу полностью типизированные подписи в своих компонентах и службах, что распространяется на мои пользовательские функции проверки для форм angular2.
Я знаю, что я могу перегрузить подпись функции, но для этого необходимо, чтобы параметры были отличается для каждого типа возврата, потому что tsc
компилирует каждую подпись в отдельную функцию:
function pickCard(x: {suit: string; card: number; }[]): number;
function pickCard(x: number): {suit: string; card: number; };
function pickCard(x): any { /*common logic*/ };
Я также знаю, что могу вернуть один тип (например, обещание), который может сам иметь несколько подтипов:
private active(): Promise<void|null> { ... }
Однако в контексте валидаторов настраиваемой формы angular2 одна подпись (один параметр типа FormControl
) может возвращать два разных типа: Object
с ошибками формы или null
, чтобы указать, что элемент управления не содержит ошибок.
Это, очевидно, не работает:
private lowercaseValidator(c: FormControl): null;
private lowercaseValidator(c: FormControl): Object {
return /[a-z]/g.test(c.value) ? null : { lowercase: this.validationMessages.lowercase };
}
И не делаю
private lowercaseValidator(c: FormControl): null|Object {...}
private lowercaseValidator(c: FormControl): <null|Object> {...}
(Интересно, что я получаю следующие ошибки, а не что-то более информативное:
error TS1110: Type expected.
error TS1005: ':' expected.
error TS1005: ',' expected.
error TS1128: Declaration or statement expected.
)
TL;DR
Я просто использую
private lowercaseValidator(c: FormControl): any { ... }
что, казалось бы, сводит на нет преимущество наличия сигнатур типов?
В общем, с нетерпением жду ES6
Хотя этот вопрос вдохновлен валидаторами форм angular2, которые обрабатываются непосредственно фреймворком, поэтому вы можете не заботиться об объявлении возвращаемого типа, он по-прежнему применим, особенно с учетом таких конструкций ES6, как function (a, b, ...others) {}
Возможно, просто лучше избегать написания функций, которые могут возвращать несколько типов, но это довольно идиоматично из-за динамической природы JavaScript.
Object
, используйте вместо этогоany
. (2) Это:private lowercaseValidator(c: FormControl): null|Object {...}
должно работать. - person Nitzan Tomer   schedule 25.10.2016null | Object
, похоже, работает на игровая площадка - person Sean Vieira   schedule 25.10.2016Object
почти похоже на использованиеany
, но: Тип any - это мощный способ работы с существующим JavaScript, позволяющий постепенно включать и отключать проверку типов во время компиляции. Вы можете ожидать, что Object будет играть ту же роль, что и на других языках. Но переменные типа Object позволяют вам присваивать им любое значение - вы не можете вызывать для них произвольные методы, даже те, которые действительно существуют (typescriptlang.org/docs/handbook/basic-types.html#any) - person Nitzan Tomer   schedule 25.10.2016