【发布时间】:2020-01-17 05:47:49
【问题描述】:
当使用包含一起使用管道| 的字符串的类型时,这意味着这些字符串中的任何一个都可以用作值。在下面的示例中,TFoo 包含这三个值,foo、bar 和 baz。
使用[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