Сгенерировать тип TypeScript с точечной нотацией, исключая / останавливая определенные пользовательские типы

Файлы переводов обычно выглядят так:

const en = {
  screen1: {
    description: 'Some description'
  },
  screen2: {
    plural: {
      one: 'One day remaining',
      other: '%{count} days remaining'
    }
  }
}

i18n-js, например, принимает ключ / область действия, например, translate('screen1.description').

С помощью этих вопрос и ts-toolbelt можно создать тип с точечной нотацией, представляющей все листья.

Однако в случае множественного числа вам понадобится только ключ screen2.plural, который будет передан в функцию translate.

Я попытался ввести новый тип:

interface Plurals {
  [key: string]: string
}

plural: {
  one: 'One day remaining',
  other: '%{count} days remaining'
} as Plurals

но не смог отфильтровать или остановиться на желаемом ключе plural, потому что тип самого объекта не известен в приведенных выше примерах.

Это вообще возможно?

Заранее спасибо.

Ваш тип Plurals нелегко отличить от других типов, чтобы быть полезным. Система типов TypeScript - структурный, а не номинальная, поэтому компилятор увидит, что множество вещей присваивается Plurals. С прагматической точки зрения, как можно обнаружить такое множественное число без TypeScript? Всегда ли они на ключе с именем plural? Всегда ли у них есть свойства с именами one и other? Предположительно, что-то иное, чем «объект со строковыми свойствами».

jcalz 31.03.2021 04:01

Я имею в виду, работает ли что-нибудь из эти для вас? Если да, напишу ответ. Если нет, я думаю, я не понимаю, как вы ожидаете, что компилятор распознает, где находятся «множественные» объекты. и мне нужно больше минимальный воспроизводимый пример здесь.

jcalz 31.03.2021 04:18

Ключ plural является примером и может иметь любое произвольное имя (daysRemaining, numberOfAlbums и т. д.). i18n-js действительно определяет набор по умолчанию свойств, но, вероятно, также может включать few или many. На практике у вас может быть несколько ключей перевода, которые содержат определение множественного числа. Я ожидал, что компилятор увидит тип как есть, но поскольку он не является номинальным, вероятно, нет другого способа, кроме как сгладить весь объект и использовать только подход keyof typeof languageObject.

LordOfBones 31.03.2021 10:10

Итак, какой ответ вы хотели бы здесь видеть? Я счастлив написать один из них, но я не могу сказать, какие из упомянутых мною подходов подходят. Похоже, что «имитация номинального набора текста» - единственное, что вы можете использовать как есть. Но если для вас это неприемлемо, то, по-видимому, «это невозможно, извините» - единственный ответ. Дай мне знать.

jcalz 31.03.2021 16:28
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
1
4
28
0

Другие вопросы по теме