Автор оригинала: Giorgio Delgado.
Предположим, вы разработчик API заднего конца, и вам нужен путь к Гарантия во время компиляции Что вы отправляете только JSON-Serializable Data из ваших API.
У вас есть Отправить
Функция, которая принимает некоторые данные и отправляет его на API потребитель.
const send =(data: T): Promise => { // magic... // or more realistically // calls express' res.json() method! }
И вы пытаетесь предотвратить попытку разработчиков отправить следующее из вашего API:
send({ makesNoSense: () => { console.log('woops!') }, myDate: new Date(), })
Вышесказанное будет строгое (то есть сериализовано) под капотом в {MyDate: «ISO-Date-String»}
Отказ Функции не являются частью SPEC JSON, и поэтому будут удалены полностью. И Дата
s автоматически отказываются от строк, которые не очень эффективный способ отправки временных меток в сети (HINT: вы хотите, чтобы метки Unix в форме целого числа).
Удар! Выглядит как разработка забывала, чтобы вызвать функцию, а также забыл позвонить Date.getteime
😭.
Так как мы предотвратим эту вещь?
Тип ограничения на спасение
Ограничение типа – это «правило», которое сужает возможности того, что может быть универсальным типом.
Например, в Отправить
Определение выше, мы объявили переменную типа T
это вообще не ограничено. Вот почему мы смогли позвонить Отправить
со значениями, которые не являются json serialized.
// This compiles ... API would send `{}` send(new Set([1,2,3]))
Таким образом, мы можем сузить возможности общего типа T
Разрешить разрешать значения JSON как следует следующим образом:
const send =(data: T): Promise => { // ... }
Единственное отличие в том, что теперь мы добавили продлевает jsonvalues
к типу переменной декларации для T
Отказ
На простом английском Т продлевает jsonvalues
Переводит, ” t
– это универсальный тип, который должен соответствовать определению jsonvalues
“.
Что такое Jsonvalues
?
Это определяется как это:
type JSONValues = number | string | null | boolean | { [k: string ]: JSONValues } | JSONValues[]
… да, это вся спецификация JSON В 7 строках кода! 🤯.
Теперь, если я позвоню Отправить (новый набор ([1,2,3]))
Я получу ошибку типа. Whaaaat?!?!
Теперь вы можете гарантировать при компиляции времени, когда вы отправите только действительные данные для ваших потребителей JSON API
Живая демонстрация
Заключение
Ограничения типа являются очень мощным способом в эксплуатации ваших TypeyctScript CodeBases.
Для каждого универсальной переменной типа вы хотите ограничить, вы бы добавили простирается сразу
к определению. Пример:
const myFn =() => {...}
Надеюсь, это поможет!
Бесстыдный штекер
Понравился этот пост?
Я поток функционального программирования, типографии и разработки ELM каждый вторник в 10 утра на повернуться!
https://www.twitch.tv/vimboycolor