【问题标题】:Generics: use type as object key in typescript泛型:在打字稿中使用类型作为对象键
【发布时间】:2020-01-17 05:47:49
【问题描述】:

当使用包含一起使用管道| 的字符串的类型时,这意味着这些字符串中的任何一个都可以用作值。在下面的示例中,TFoo 包含这三个值,foobarbaz

使用[P in TFoo],我们可以告诉打字稿,这些字符串中的任何一个都可以用作 TDirect 类型对象中的键。 VSCode 帮助完成代码,我们可以成功构建direct,没有错误。

在我们的例子中,TFoo 并不总是相同的,实际上它会包含不同的事件名称,具体取决于微服务。所以我们尝试使用 TGeneric 中的泛型。这就是 T 加下划线的地方,我们得到以下错误:

Type 'T' is not assignable to type 'string | number | symbol'.
  Type 'T' is not assignable to type 'symbol'.ts(2322)

奇怪的是,VSCode 似乎理解我们正在尝试做的事情,它仍然有助于智能感知并正确地将 wrong: "value" 突出显示为不正确。

tsc 将导致编译器错误(见上文)。在自己的文件中移动 TGeneric 以及使用例如ts-node --files src(假设所有文件都在 src 中)一切运行良好。

所以我们目前遇到的问题是我们得到了我们想要的,因为我们有智能感知并且代码仍然使用 ts-node 运行。但我们实际上对这种奇怪的行为有一种不好的感觉。

也许有人有防弹解决方案?

type TFoo = "foo" | "bar" | "baz";


type TDirect = { [P in TFoo]?: any };
const direct: TDirect = {
  bar: "baz"
}


type TGeneric<T> = { [P in T]?: any };
const generic: TGeneric<TFoo> = {
  bar: "baz",
  wrong: "value"
}

【问题讨论】:

    标签: typescript visual-studio-code typescript-generics


    【解决方案1】:

    我相信这是因为索引签名中的密钥类型必须是字符串或数字。因此,您必须将T 限制为string | number

    type TGeneric<T extends string | number> = { [P in T]?: any };
    

    见:https://www.typescriptlang.org/play/index.html#code/C4TwDgpgBAKgYgewVAvFARAMyeqAfDAIwEMAnXA9EgL3QCg7RJYBxCAOwlIEsBjAHhhQIAD2AcAJgGcoU4D3YBzfFHYBXALaEuAPlRQA3lADaABSjd2sALoB+AFxRi7EFAC+Abga8E7OVEUOLj5HGDZOHgF4JD00AzooKBJSRypiWgAaBKgAd1JfRVSAN2IAGzUIejcgA

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-18
      • 2020-10-11
      • 2019-01-16
      • 1970-01-01
      • 2021-05-21
      • 2017-09-15
      • 2020-05-25
      • 1970-01-01
      相关资源
      最近更新 更多