我正在尝试为对象定义类型:
const width: Rule = {
// regular keys with any name
full: "100%",
half: "50%",
// special keys
$px: [10, 50, 100],
$rem: [1, 1.5, 2],
$em: [1, 1.5, 2],
}
其中 Array<number>
值只能与特殊键 ('$px' | '$em' | '$rem'
) 一起使用,而 string
值只能与常规键一起使用。
所以我尝试了这样的事情:
export type Special = "$px" | "$em" | "$rem";
export type Rule<K extends string> = {
[key: K]: K extends Special ? Array<number> : string;
}
但在 [key: K]
处出错:
(parameter) key: K extends string
An index signature parameter type must be either 'string' or 'number'.ts(1023)
我做错了什么?
更新:
评论中提出的答案在我的情况下不起作用,因为我没有带有已知键的声明接口。我有一个 Record<string, string | Array<number>>
而不是做类似的事情:
export type Rule = {
[K in keyof Record<string, any>]: K extends Special ? Array<number> : string;
};
在特殊键上给出错误:
<块引用>(property) $px: number[]
Type 'number[]' is not assignable to type 'string'.
到目前为止,我得到了这样的结果:
export type Rule = Record<string, string | Array<number>> &
Partial<Record<Special, Array<number>>;
但显然它允许在不理想的常规键上设置 Array<number>
。