TS中,这一段代码如何修改才能不报错?

新手上路,请多包涵

代码如下

const tup = ['A', 'B', 'C'] as const;

type TupleToObject<T extends readonly (string | number | symbol)[]> = {
  [K in T[number]]: K
}

type tupleObj = TupleToObject<typeof tup>

const res: tupleObj = tup.reduce((res, item) => {
  res[item] = item;
  return res;
}, {} as tupleObj);

在 reduce 中,res[item] = item这一行报错,信息如下,求一个原因和解决办法。
image.png

阅读 1.4k
1 个回答

你这类型限制的太死了

const tup = ['A', 'B', 'C'] as const;

type TupleToObject<T extends readonly (string | number | symbol)[]> = {
  [K in T[number]]: K
}

type TupleObj = TupleToObject<typeof tup>

const res = tup.reduce((res, item) => {
  res[item] = item;
  return res;
}, {} as Record<string, string>) as TupleObj;

实际上就是下面这种:总共有3*3=9种组合 res['B']='C' 但是你规定的A只能对应A所以就报错了

res['A' as 'A' | 'B' | 'C'] = 'A' as 'A' | 'B' | 'C';
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进