Эта ошибка возникает, когда вы используете переменную для индексации типа с нединамическими c свойствами. Поэтому, чтобы обойти это, вам нужно изменить объявление типа DefaultTheme.fonts.size
, чтобы иметь определение для динамических c свойств. (По сути, средство проверки типов не может узнать, будет ли переменная, переданная в индекс ([]
), точно соответствовать одному из объявленных ключей. Поэтому вы должны сказать: «Я в порядке с any *»). 1004 * цифра c или строковый ключ ".)
, если вы все еще хотите объявить известные ключи:
export interface DefaultTheme {
fonts: {
size: {
[key: number]: string;
14: string;
12: string;
10: string;
};
}
Но, если вас не волнует, что указано * Размер шрифта 1026 *, вы можете просто сделать
export interface DefaultTheme {
fonts: {
size: {
[key: number]: string;
};
}
Эти два параметра фиксируют определение типа, чтобы принять любое число в качестве ключа. Кроме того, вы можете привести fontSize
к типу ключа (используя keyof
), который по сути является enum
, в котором все ключи объекта являются значениями. Вы говорите контролеру типов: «эта переменная должна быть любым из указанных значений c (любой из ключей в указанном типе c)»:
// in the template where you use the font size
props.theme.fonts.size[props.fontSize as keyof typeof props.theme.fonts.size]
// or using the type declaration directly
props.theme.fonts.size[props.fontSize as keyof DefaultTheme["font"]["size"]]
Вы также были на правильном пути объявив тип размера шрифта, но вы немного ошиблись в синтаксисе:
export type StyledThingieProps = {
fontSize?: keyof DefaultTheme["font"]["size"];
}
Это еще один способ исправить это.