TypeScript将对象视为空类型而不是定义的接口

mwkjh3gx  于 2023-03-04  发布在  TypeScript
关注(0)|答案(1)|浏览(135)

我在一个TypeScript项目中定义了一个名为Theme的接口,它有一个名为typography的属性。typography属性应该有一个基于名为TypographyVariant的枚举的动态属性集。下面是我的代码:

export type TypographyVariant =
  | 'label-large'
  | 'label-medium'
  | 'label-small';

export interface Theme {
  typography: {
    [key: TypographyVariant]: {
      lineHeight: string;
      fontSize: string;
      letterSpacing?: string;
      fontWeight?: number;
    };
  };
}

const theme: Theme {
  typography: {
    'label-large': {
      lineHeight: '20px',
      fontSize: '14px',
      letterSpacing: '0.1px',
      fontWeight: 500,
    },
    'label-medium': {
      lineHeight: '16px',
      fontSize: '12px',
      letterSpacing: '0.5px',
      fontWeight: 500,
    },
    'label-small': {
      lineHeight: '16px',
      fontSize: '11px',
      letterSpacing: '0.5px',
      fontWeight: 500,
    },
  }
};

我的代码编辑器将theme中的typography对象视为{}类型,而不是我在Theme接口中定义的类型。
问题是当我尝试定义主题对象时,我的代码编辑器将typography属性视为空对象,而不是Theme接口中定义的动态属性集。我不确定为什么会发生这种情况,也不知道如何解决它。有人能帮我找出问题所在吗?谢谢!

3vpjnl9f

3vpjnl9f1#

您当前的类型定义了typography,这样它只能包含来自TypographyVariant的键,但是如果我理解正确的话,您需要任何typography来定义 * 所有 * 变量。
使用Record定义typography是一种很好的方法:

export interface Theme {
  typography: Record<TypographyVariant, {
      lineHeight: string;
      fontSize: string;
      letterSpacing?: string;
      fontWeight?: number;
    }>
}

相关问题