Мне было интересно, могу ли я иметь условные типы в TypeScript?
В настоящее время у меня есть следующий интерфейс:
interface ValidationResult {
isValid: boolean;
errorText?: string;
}
Но я хочу удалить errorText
, и только тогда, когда isValid
естьfalse
как требуется собственность.
Я хотел бы написать его как следующий интерфейс:
interface ValidationResult {
isValid: true;
}
interface ValidationResult {
isValid: false;
errorText: string;
}
Но, как вы знаете, это невозможно. Итак, что вы думаете об этой ситуации?
javascript
typescript
types
Arman
источник
источник
isValid
этоfalse
?Ответы:
Один из способов моделирования такой логики - использовать тип объединения, что-то вроде этого
Затем компилятор может сузить тип на основе логического флага
источник
r
должен бытьInvalid
здесь типа .Чтобы избежать создания нескольких интерфейсов, которые используются только для создания третьего, вы также можете чередовать напрямую с
type
вместо этого:источник
Союз продемонстрировал ошибками , как я рекомендую ее обработки. Тем не менее, Машинопись делает что - то , известное как « условные типы » , и они могут справиться с этим.
Эта
ValidationResult
(что на самом делеValidationResult<boolean>
связано с параметром по умолчанию) эквивалентно объединению, созданному в ответе ошибок или в ответе CertainPerformance , и может использоваться таким же образом.Преимущество здесь в том, что вы также можете передать известное
ValidationResult<false>
значение, и тогда вам не нужно будет проверять,isValid
как это было бы известноfalse
иerrorString
будет существовать. Вероятно, в таком случае нет необходимости, и условные типы могут быть сложными и трудными для отладки, поэтому их, вероятно, не следует использовать без необходимости. Но вы могли бы, и это казалось заслуживающим упоминания.источник
extends
является правильным оператором для использования. И это имеет очень мощный, в частности , так как вы можете использовать его , чтобы вырыть на типы:type SecondOf<T> = T extends Pair<any, infer U> ? U : never;
.SecondOf<number>
«расширяется» доPair<any, number>
? Я полагаю, здесь уместно высказывание «не суди книгу по обложке».SecondOf<Pair<any, number>>
оценивает доnumber
.SecondOf<number>
оцениваетnever
, потому чтоnumber extends Pair<any, infer U>
является ложным, посколькуnumber
не распространяется ни на чтоPair