WedX - журнал о программировании и компьютерных науках

Typescript — использование типов для ограничения параметров

Интернет. Давний слушатель, бла-бла-бла.

У меня есть приложение React, использующее Typescript. У меня есть функция в одном файле, которая принимает ограниченный диапазон строк, и функция в другом файле, которая вызывает эту штуку. Этим утром я был готов двигаться дальше, когда понял, что — да — это, вероятно, прекрасная возможность проверить тип и улучшить стабильность в будущем.

С тех пор я медленно схожу с ума. Я упускаю что-то важное, но никакие чтения или случайные комбинации типов и интерфейсов не приблизили меня к этому. Любая помощь приветствуется.

Страница Леса:

toggle = (e: any) => {
  const target = e.currentTarget.dataset.toggletarget;
  Tree.toggle(target);
}

Дерево:

type cart = "elm" | "oak" | "pine";
type Itoggle = (target: cart) => void;

const toggle: Itoggle = (target: cart) => {
  console.log('Now toggling', target);
}

Загвоздка здесь в том, что ForestPage может передать любую строку, и все будет работать нормально. Что делает «тележка», если не устанавливает тип?

Я начал помещать это в Code Snippet, но, похоже, у него не было подходящих библиотек (включая TypeScript), а этот пост уже на двух страницах, а сейчас пятница, 4:00.


Приведенный выше код является самой простой версией моего кода. Я также пробовал множество других вариантов.

https://tutorialsteacher.com/typescript/typescript-interface

type cart = "elm" | "oak" | "pine";
interface Itoggle = {
  (target: cart) : void
}

const realToggle = (target: cart) => {
  console.log(target);
}

const toggle: Itoggle = realToggle;

Во-первых, tsLint превратил Itoggle из интерфейса обратно в самостоятельный тип. Затем результаты не изменились — я все еще могу передать любое значение в цель.


Как потребовать определенную строку в интерфейсе TypeScript

Здесь я узнал, что «тележка типа» может заменить «тележку перечисления».


https://medium.com/@KevinBGreene/typescript-enums-and-polymorphism-with-type-matching-fc3dc74b031c

enum cart = elm, oak, pine;

interface elm {
  target: cart.elm
}

interface oak {
  target: cart.oak
}

type targetType = elm | oak

const toggle = (target: targetType) => {
  console.log(target)
}

Я думаю, что у меня это сработало, но мне нужно было

console.log(target.target.target)

что явно глупо.

const toggle = (target: cart) => {

ошибся. Боюсь, я не помню точно как, но думаю, что это как-то связано с тем фактом, что перечисления изначально имеют тип {[ключ: строка]: число}, а я просто отправлял строку.


https://2ality.com/2020/01/typescript-enums.html#use-case%3A-safe-string-constants

Изменено перечисление от до:

enum cart {
  elm: "elm",
  oak: "oak",
  pine: "pine"
}

но он все еще хотел, чтобы его покормили каким-нибудь предметом, и в любом случае это выглядело все более маловероятным.


https://thoughtbot.com/blog/booleans-and-enums

Полезная статья о перечислениях, но ничего не говорится о параметрах. Я отказываюсь смотреть на перечисления, почти уверен, что лаю не по тому дереву. Вернемся к типам.


Но, но... они должны работать, верно? https://typescriptlang.org/docs/handbook/enums.html


Я также пробовал экспериментировать с созданием новых типов и перечислений на лету на основе доступных данных, но это сломало линтер. Что, я думаю, имеет смысл. Он построен не в том месте, где его нужно читать.

interface pleaseWork {};

const options = ["elm", "oak", "pine"];
_.each(options, (option) => {
  pleaseWork[option] = option...  etc, etc

Там были разные сорта, конечно, ни один из которых не был хорош. Опять же, логически, это имеет некоторый смысл. Но к этому моменту я сломался.


В любом случае, любое руководство приветствуется. Я смотрел на это достаточно долго, чтобы ничего больше не имело смысла, и я не чувствую, что добьюсь прогресса без хотя бы мягкого толчка в правильном направлении.



Ответы:


1

Я думаю, вы сосредоточены на исправлении неправильной вещи. Ваша первая версия Tree должна подойти. Но то место, где вы это называете, вы называете с помощью any. e — это any, поэтому любые свойства на e также являются any. Это фактически говорит машинописи не проверять ваши типы.

toggle = (e: any) => {
  const target = e.currentTarget.dataset.toggletarget;
  Tree.toggle(target);
}

Я точно не знаю, что это за тип события, поэтому я не уверен, что это правильный тип, но в качестве примера:

toggle = (e: React.MouseEvent<HTMLButtonElement>) => {
  const target = e.currentTarget.dataset.toggletarget;
  Tree.toggle(target);
}

С помощью этого кода typescript увидит, что target является строкой, и, таким образом, не позволит вам вызвать Tree.toggle, так как это слишком широкий тип. Добавьте некоторый код, чтобы проверить, что это за строка, и она будет разрешена.

toggle = (e: React.MouseEvent<HTMLButtonElement>) => {
  const target = e.currentTarget.dataset.toggletarget;
  if (target === 'elm') {
    Tree.toggle(target);
  }
}
22.05.2020
  • О, чувак. Это вполне может быть так - я ожидал, что разрешения будут становиться все более строгими, но любое переопределение всего звучит как ерунда, в которой я всегда ошибаюсь. Под все более «строгим» я подразумеваю, например, принятие чего-либо на высшем уровне. Но затем следующая функция требует, чтобы она соответствовала типу транспортного средства, тогда функция, которая вызывает, настаивает на грузовике. Или, знаете, что угодно. В отличие от всего, что льется каскадом вниз по линии. Я попробую это в следующий раз, когда у меня появится возможность, и отчитаюсь. Большое спасибо. 23.05.2020
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: wedx@cp9.ru