Таким образом, «правильный» ответ на этот вопрос, вероятно, выглядит следующим образом:
import { PaletteColor } from "@material-ui/core/styles/createPalette";
, а затем
const noLongerFails = (key: keyof PaletteColor) => {
const theme = createMuiTheme();
const color = theme.palette.primary[key];
console.log(color);
};
Обратите внимание, что мы хотим, чтобы key
был одним из ключей PaletteColor
, поэтому мы используем оператор типа keyof
, чтобы превратить тип объекта в объединение его ключей.
Отслеживание правильного типа PaletteColor
и места его экспорта немного неприятно (может быть, у кого-то есть лучшее решение, чем то, что я сделал), но оно выглядит так:
наведите курсор мыши на theme.palette.primary
в вашей IDE и посмотрите, что IntelliSense говорит о его типе:
![IntelliSense](https://i.stack.imgur.com/yJ68Y.png)
В данном случае написано (property) Palette.primary: PaletteColor
. Так что если нам повезет, экспортируется тип, называемый PaletteColor
.
Если у вас есть соответствующая node_modules
информация для material-ui, установленная локально, вы можете найти ее для этого типа. Если нет, вы всегда можете взглянуть на исходный код и найти его . К счастью, есть один удар , и вы можете видеть, что он экспортируется как interface
в styles/createPalette.d.ts
.
Мы импортируем оттуда, и это работает!
Если мы не смогли найти соответственно экспортируемый тип, мы могли бы вместо этого начать используя запросы типов TypeScript, чтобы дразнить требуемый тип из вещей, которые мы можем импортировать:
type MyPaletteColor = ReturnType<typeof createMuiTheme>["palette"]["primary"];
Давайте сделаем это шаг за шагом. Учитывая именованное значение, такое как createMuiTheme
, мы можем запросить TypeScript для его типа, используя оператор запроса типа typeof
. (Не путать с оператором runtime typeof
. См. этот ответ для подробного объяснения различия между именами типов и именами значений) Так что typeof createMuiTheme
является типом функции :
type CreateMuiThemeType = typeof createMuiTheme;
// type CreateMuiThemeType = (options?: ThemeOptions | undefined, ...args: object[]) => Theme;
Теперь эта функция возвращает Theme
. Чтобы получить этот тип (делая вид, что мы его еще не импортировали), мы можем использовать тип утилиты ReturnType
:
type MyTheme = ReturnType<CreateMuiThemeType>;
// type MyTheme = Theme;
Наконец, мы знаем, что тип Вы ищете primary
свойство palette
Theme
. Для этого мы можем использовать типов поиска с использованием индексированной записи доступа:
type MyPalette = MyTheme["palette"];
// type MyPalette = PaletteColor;
type MyPaletteColorAlso = MyPalette["primary"];
// type MyPaletteColorAlso = PaletteColor;
Мы можем свернуть их в одну строку, как в MyPaletteColor
выше. И если у нас есть собственное определение MyPaletteColor
, мы можем использовать его вместо PaletteColor
:
const alsoWorks = (key: keyof MyPaletteColor) => {
const theme = createMuiTheme();
const color = theme.palette.primary[key];
console.log(color);
};
, и это тоже работает.
Хорошо, надеюсь, это поможет; удачи!
Stackblitz ссылка на код