首页 > 解决方案 > 如何键入映射到对象的字符串数组,其中键及其值是数组值

问题描述

这是我想要实现的目标

function Enum<T extends string>(arr: T[]): Record<T, T> {
  return arr.reduce((next, key, index) => {
    next[key] = key
    return next
  }, {} as Record<T, T>)
}
const Codes = Enum([
  'foo',
  'bar'
])

我想让打字稿知道 Codes.foo 只是'foo'。现在它认为它可以是'foo' | '酒吧'

我知道枚举。这更像是一个好奇的问题。

标签: typescript

解决方案


您应该使用{ [K in T]: K }而不是Record<T, T>告诉打字稿键实际上是值:

function Enum<T extends string>(o: T[])  {
  return o.reduce((next, key) => {
    next[key] = key;
    return next;
  }, {} as {[K in T]: K});
}

推荐阅读