typescript - 为什么 Typescript 不能在赋值中使用泛型的 keyof 类型并将

我遇到了一个奇怪的 Typescript 赋值错误,我想更多地了解它为什么不起作用。作为引用,我使用的是 TS 3.9.2

代码:

function test<U extends object>(a: U, k: keyof U) {
    const x: Partial<U> = { [k]: a[k] };
    // ...
}

错误:

Type '{ [x: string]: U[keyof U]; }' is not assignable to type 'Partial<U>'.

问题仅在我使用泛型时出现,例如,如果我使用具体接口(interface)而不是 U,那么它会按预期工作。

我假设类型系统无法正确推断 U 的键并在赋值期间使用它们,这是为什么?我在 { [k]: a[k] } 中检查了 k 的类型,它正确地返回了 keyof U 所以我不完全理解为什么类型系统不能使用该信息来检查分配是否合法并将 k 泛化为 string

谢谢。

最佳答案

我认为,它不起作用的唯一原因是 typescript 没有完全理解您的意图,因为您创建了一个新对象,但没有关于它的信息。

在这种情况下最好告诉编译器,现在你有原始对象的一部分

function test<U>(a: U, k: keyof U) {
    const x: Partial<U> = { [k]: a[k] } as Partial<U>;

    return x;
}

它会起作用

关于typescript - 为什么 Typescript 不能在赋值中使用泛型的 keyof 类型并将其泛化为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63200001/

相关文章:

python - 多交易所、多币种、多金额的套利算法

python - 当我的播放器类与我的平台类之一发生碰撞时,如何制作和结束屏幕?

macos - 没有应用程序包的 QT 命令行可执行二进制文件有 Macdeployqt 吗?

python - 使用 pydbgen 模块时出现 TypeError

python - 无法将从 MongoDB 检索到的 json 值返回到 python flask

mongodb - 更新嵌套数组的字段时,如何使 mongodb 的 "updated"停止?

python - 如何在不返回并更改数据的情况下更改 seaborn fiddle 图的 x 轴标签

python - 如何使用python将NPZ文件转换为文本文件

ruby-on-rails - ActiveStorage 和 s3 - 默认设置所有公开的图像

node.js - 如何避免使用 discord.js api 超过速率限制?