具有基于键的条件值的打字稿对象

时间:2021-04-22 09:41:17

标签: typescript

我正在尝试为对象定义类型:

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>

0 个答案:

没有答案