появился еще B, объединил их в типе MyType MyType = interface A { operator: 'bla', value: string } | interface B { operator: 'foo', value: string[] }, добавил два гарда, чтобы выводить A или B по полю operator. Теперь понадобилось еще расширить B => interface B { operator: 'foo', value: string[] | C[] } и хочу теперь различать interface B с value: string[] и interface B с value: C[], как это лучше описать? Чтобы сделать гард на interface B с value: C[] надо на что-то ссылаться, мб правильнее разделить interface B на два?
value: string[] | C[] C - это generic или что?
Просто тогда можно так описать interface B <C = string> = { operator: 'foo', value: C[] }
я скажу страшное - может вам типы и не нужны? type Either<A, B> = [A, undefined?] | [undefined, B]; вот в таких шутках это удобно а у вас какой-то матан из типов получается просто после таких вопросов я понимаю js-еров которые говорят что ts делает все излишне сложным go вообще пошел по пути "не каждому девелоперу нужна вся мощь языка" поэтому лучше мы не дадим всю мощь нежели дадим писать разрабу нечитаемый код
Это на самом деле не оч хороший Either, лучше своровать его из фп-тс
Одним гвардом это не сделать, тк гвард не хранит контекст того какое поле реализуется
начали вот тут я на шляпу автора говорил что если ты создал из типов стейтмашину - может тебе типы и не нужны и привел пример простого кода где типы нужны
Ну как, я мог бы придраться, что это лишний слой абстракций, тк вы используете отдельный тип, чтобы обвернуть два других типа, но ладно. Ну и название тогда не очень удачное имхо
Сразу говорю, ключевое слово тут "придраться"
Обсуждают сегодня