a: string,
                  
                  
                      b: string
                  
                  
                  }
                  
                  
                  
                  
                  
                  type B = {
                  
                  
                      c?: string
                  
                  
                  } & A
                  
                  
                  
                  
                  
                  const s:B = {
                  
                  
                      a: 'ss',
                  
                  
                      b: 'xx',
                  
                  
                      c: 'vv'
                  
                  
                  }
                  
                  
                  
                  
                  
                    function test(a : A) {
                  
                  
                      console.log(a)
                  
                  
                  
                  
                  
                      return null
                  
                  
                    }
                  
                  
                  
                  
                  
                  // Я хочу тут увидить Ошибку
                  
                  
                  test(s)
                  
                  
                  
                  
                  
                  Потому что я не хочу допустить такого, что моя функция test, которая принимает только тип A, смогла "принять" B который & от A.
                  
                  
                  
                  
                  
                  Все strict, strict функции и т.п. стоят
                  
                  
                  
                  
                  
                  Я понимаю почему так происходит, так как это не "объединение", а пересечение,   но я хочу понять Как это можно пофиксить ?
                  
                  
                
Почему не хотите? Это ж классический пример полиморфизма
Потому что у меня к примеру есть 2 формы. 2я расширяет первую. Вот во второй форме, у меня поля принимают B тип. Но для её работы, мне нужно вначале отправить все важные типы из A в эту функцию, что бы она сделала запрос. При этом кто то может по "ошибке" передать лишний ключ c и тогда бекенд упадет, так как не ожидает этого ключа. Я вот хочу что бы мне ts ругался и говорил, что сделать там тайпгард, либо отсортируй, либо вытащи и т.п. А то сейчас он просто это пропускает
Любой язык будет пропускать. У вас, фактически, наследование. И вы передаете переменную в параметр, у которого более общий тип Решите это просто явным обращениям к существующим в типе А полям, чтобы не было ничего лишнего
Да, это я понимаю, что выше и описал. Я просто думал может есть какие то "хаки" и т.п. , как это обойти, потому что то КАК нужно понятно. Но вот этот кейс , когда новичок работает и он просто передает и не задумается что там может прийти лишний ключ, удручает.
Ну так а почему вашу систему ломает "что-то лишнее"?
Будто бы вам нужны брендированные типы
Спасибо за совет, но это уже в другое русло пойдет) В целом я согласен с выше, что нечего "костыли" выдумать, нужно самому вытаскивать то, что нужно и передавать со спокойной душой. Так же согласен с человеком выше, по поводу "переписать бекенд", там много эдж кейсов за собой потянет
Обсуждают сегодня