typescript - 为什么 Typescript 不能在赋值中使用泛型的 keyof 类型并将其泛化为字符串?

标签 typescript generics 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/

相关文章:

javascript - 映射对象键时使通用对象可选(在 keyof 中)

reactjs - 使用 props 有条件地设置样式组件中的属性,以使用 TypeScript 对主题对象进行索引?

javascript - 条件对象属性的流类型问题

javascript - 根据索引向 ngfor dom 添加元素

generics - Haxe - 如何将泛型类传递给参数

java - 从使用泛型的类中创建数组

typescript - 使通用类型 Array<keyof T> 需要 T 的所有键

javascript - 将焦点移至 Enter 键上的下一个控件

javascript - typescript 2.8.3 : Union Types without common property

java - 返回一些值的通用类方法