在这里,我只想为对象值定义类型。为了获得键的类型。是否有任何方法无需为每个值定义类型。
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
答案 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'