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 ругался и говорил, что сделать там тайпгард, либо отсортируй, либо вытащи и т.п. А то сейчас он просто это пропускает
Любой язык будет пропускать. У вас, фактически, наследование. И вы передаете переменную в параметр, у которого более общий тип Решите это просто явным обращениям к существующим в типе А полям, чтобы не было ничего лишнего
Да, это я понимаю, что выше и описал. Я просто думал может есть какие то "хаки" и т.п. , как это обойти, потому что то КАК нужно понятно. Но вот этот кейс , когда новичок работает и он просто передает и не задумается что там может прийти лишний ключ, удручает.
Ну так а почему вашу систему ломает "что-то лишнее"?
Будто бы вам нужны брендированные типы
Спасибо за совет, но это уже в другое русло пойдет) В целом я согласен с выше, что нечего "костыли" выдумать, нужно самому вытаскивать то, что нужно и передавать со спокойной душой. Так же согласен с человеком выше, по поводу "переписать бекенд", там много эдж кейсов за собой потянет
Обсуждают сегодня