Интернет. Давний слушатель, бла-бла-бла.
У меня есть приложение 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
Там были разные сорта, конечно, ни один из которых не был хорош. Опять же, логически, это имеет некоторый смысл. Но к этому моменту я сломался.
В любом случае, любое руководство приветствуется. Я смотрел на это достаточно долго, чтобы ничего больше не имело смысла, и я не чувствую, что добьюсь прогресса без хотя бы мягкого толчка в правильном направлении.