169 похожих чатов

Снова вернулся к своей задаче с TS (будь он проклят

😄), туплю.
Помогите выбраться, пожалуйста.

Как сделать так, чтобы тайпскрипт принимал только тип, четко соответствующий ОДНОМУ из значений в union типе, а не всем подряд?

Подробнее про задачу:
1) Есть продукты разных типов ProductType, каждый тип продукта имеет свой тип опций (ShirtOptions, например). Опции и продукт мапятся отдельным типом ProductOptionsMap
2) Есть корзины разных типов CartType: по одному для каждого типа продукта + (!!!) тип "all" (ProductType | "all") . В корзину можно складывать только продукты заданного типа (мапится отдельным типом CartProductMap)
3) Есть функция добавления в корзину, которая должна быть строго типизирована и ругаться, если мы в корзину "shirts" будем добавлять товар "pants". Ну или если мы в корзину "all" добавляем продукт, который имеет опции, несоответствующие ни одному из *Options типу

type CartProduct<T extends ProductType> = {
productType: T
uuid: string
options: ProductOptionsMap[T] // I want it to be exact mapped options to productType, but in case with "all" it is union of all ProductType's options
}

type Cart<T extends CartType> = CartProduct<CartProductMap[T]>[]

function addToCart<T extends CartType>(cart: T, product: CartProduct<CartProductMap[T]>) {
// add to cart of type T product with type that available for this cart
}

addToCart("shirt", {productType: "shirt", uuid: "123", options: {color: "red", width: 10}}) // OK
addToCart("pants", {productType: "pants", uuid: "123", options: {length: 20}}) // OK
addToCart("pants", {productType: "pants", uuid: "123", options: {color: "red"}}) // TS error here. Thats rigth.
addToCart("all", {productType: "pants", uuid: "123", options: {length: 20, color: "red", width: 10}}) // WHY no TS Error here???

Плейграунд:

https://www.typescriptlang.org/play?#code/C4TwDgpgBACgTgewCYFcDGwAq5oF4oBEAzgBYCWcwBUAPoWAIYB2wRBAUO6JFAMIOVsPfPGTosOWoQYAbGdQD0CqAibRu0AGYI4UCADcIcEFDCJUGKBqgBqKGgHAo23QEEAMu6s4iKzafNxIk5rAGVySgB5MGAyVV98AG92KHsEGR0ALigiYDgyJgBzFKgAdzIkYBJsphQAWwAjIyh2AF8QyRhmVmjY+KgkkpkIIqqa+qa4No6eUQtgXrimIgBZBjABqGTU4giqbPCKBZil4J3GFjZsrsvF+OmuSX5KOfE1jcHUgG0AaSgC2CBDBCCAAXWyfyUzh0hFIR2oZF8u3hABpoboCBdWAjWPRumw2lAAGRbEoEWTya5AiSQB7WZ7AV4YAA8mD0AA9gCMkL4mTSIAA+TbbAJiYE4bKYEooFAVbK5fJFEoIE7xKli459ZbvL6YUFQKEASTK3X+TmACCgTQ5DEsdXWkCQKlVyyslrMGpBaIaKCcAIcRGg5Sq0jkOP+vhQTCWfigFMBnpwAHJfCqtcF2o8eAzWRyuUweXxHCChfgGXzmeXqTq9QKvqDOJooxgYwwkEhMAgc2yIJzub4GSWABQOSiStEe+bZKsayuOPk10ECgCUpNSULbTot9kcsesbMn4jKZBD1iqDCcDH0DDIMgYDWG6Ks5F8o+AD03nYZQ+RlAIaMSQ9xUgbJfyoNEZTlQgAEYACYAGZ-2ddNskSNB0iyQg4AgJAkPKSpqigaCAAZWlaZd2E-LtHB-LE2AAoD+VAuikMgpBQLgxC0TTU5UOGUZCNg0jyMo9svxozF8SQwDqRBZipIg2V2JghCkJ4tUtnQjI4FA7DcLI1coUwUI9DgRBdBIIwIAAOigTASAvXx8kKKprNEjtqMoH8KWkxi5LxS5WKUjjVO4l0iD4kYXME4i0S0zCCD0vCKjGIjhMM5QAHUAAkAE0oCYS1jKgABRMyYUs7CAH4as4TggA

3 ответов

12 просмотров
Aleksey-Vilchik Автор вопроса

Задача упростилась до: как сделать так, чтобы TS ругался здесь, что объект не соответствует строго одному из типов? type ShirtOptions = { color: string width: number } type PantsOptions = { length: number } type allOptions = PantsOptions | ShirtOptions const expectTSErrorHere: allOptions = { // <<<< EXPECT ERROR HERE, because there is no exact such type color: "red", length: 20 }

Aleksey Vilchik
Задача упростилась до: как сделать так, чтобы TS р...

добавить в тип дискриминатор type ShirtOptions = { type: 'shirt' color: string width: number } type PantsOptions = { type: 'pants' length: number }

Aleksey-Vilchik Автор вопроса
Ivan Pirogov
добавить в тип дискриминатор type ShirtOptions = {...

Вау, спасибо большое! Побежал читать про дискриминаторы❤️

Похожие вопросы

Обсуждают сегодня

читать файл максимально быстро? странный вопрос))
zamtmn
53
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
Приветствуем всех! Устали без проектов? Если вы программист и хотите получать стабильные заказы, компания Elif предлагает вам недельный курс по поиску проектов и их ведению. ...
Elif
1
А чего сейчас в моде вместо Error для эксепшенов? А то я тут внезапно узрел что он не рекомендуется :) У Try::Tiny какой-то совершенно ужасный синтаксис если надо конкретные э...
Denis F
19
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Привет. Сразу скажу, что на C/C++/Rust я не пишу, но тем не менее возникла потребность дебага C/C++/Rust кода. Суть: есть серверное приложение, которое периодически ведёт себ...
ninekeem 🐳
4
всем привет! углубившись в плюсы и начав изучать реверсинг понял, что без асм'а никуда со своими высокоабстрактными представлениями начал изучать механизмы асма, и не совсем п...
9
Всем привет, после Си стоит учить плюсы или лучше на раст перейти?
Linus
8
или вы считаете муит дает знание?
супер_лох_3000 альфа версия
12
значить например он учился в СДУ то получается он особенный?)
Asets Serikov
11
Карта сайта