打字稿:定义对象类型而不定义要获取keyof的键的类型

时间:2020-02-13 04:30:08

标签: typescript typescript-typings

在这里,我只想为对象值定义类型。为了获得键的类型。是否有任何方法无需为每个值定义类型。

const sizes: Record<string, CSSObject>= {
  md: {
    padding: [10, 24],
    fontSize: 'medium',
  },
  xs: {
    padding: [6, 12],
    fontSize: 'small',
  },
  sm: {
    padding: [8, 16],
    fontSize: 'small',
  },
  lg: {
    padding: [14, 30],
    fontSize: 'large',
  },
} as const;

// Expecting 'md' | 'xs' | 'sm' | 'lg'
type Sizes = keyof typeof sizes;

// But it is string

1 个答案:

答案 0 :(得分:1)

据我了解,您想从对象的实际属性中推断出键'md' | 'xs' | 'sm' | 'lg',但是您还希望类型检查器确保属性值的类型为CSSObject

问题在于,您需要在对象文字上使用类型注释,以检查值是否为CSSObject;但是如果您使用类型注释,那么keyof ...将从带注释的类型而不是对象本身获取键。

解决此问题的方法是使用泛型辅助函数,以便在指定值类型时推断记录的键类型:

function helper<K extends PropertyKey>(obj: Record<K, CSSObject>): Record<K, CSSObject> {
    return obj;
}

const sizes = helper({
  md: {
    padding: [10, 24],
    fontSize: 'medium',
  },
  // ...
});

type Sizes = keyof typeof sizes;
// 'md' | 'xs' | 'sm' | 'lg'

Playground Link