类型 { [x: 字符串]: T[S]; } 不可分配给类型 'Partial<T>'

Ser*_*sky 6 typescript typescript-generics typescript-typings

我有这个代码部分,非常简单:

interface A {
    z: string;
    y: number;
}

let newA = <T, S extends keyof T>(key: S, value: T[S]): Partial<T> => {
    return {[key]: value};
}
Run Code Online (Sandbox Code Playgroud)

我看到一条错误消息: Type '{ [x: string]: T[S]; }' is not assignable to type 'Partial<T>'

我可以假设问题与 相关{},它总是映射keystring

但即使有明确的类型说那应该是string我没有结果

只有一种可行的解决方案是删除Partial<T>,但这不是一个好的解决方案

希望能从一些专家级的typescript人那里得到一些答案,他们可以描述该问题的机制,并得到这种情况的解决方案

笔记!该问题仅与一般情况有关。没有这个一切都会好起来的。

使用此代码的 Typescript Playground

cap*_*ian 0

您不需要使用部分。具有计算键的对象总是被推断为{[prop:string]:any infered type}

您可以重载您的函数以避免此类行为:

type Json =
    | null
    | string
    | number
    | boolean
    | Array<JSON>
    | {
        [prop: string]: Json
    }

function record<Key extends PropertyKey, Value extends Json>(key: Key, value: Value): Record<Key, Value>
function record<Key extends PropertyKey, Value extends Json>(key: Key, value: Value) {
    return { [key]: value };
}

const result = record('a', 42) // Record<"a", 42>
Run Code Online (Sandbox Code Playgroud)