【问题标题】:Typescript generices incorrectly deals with partial打字稿泛型错误地处理部分
【发布时间】:2020-04-01 04:23:24
【问题描述】:

使用 typescript 3.7.2 时,以下函数出现错误:

function updateWithPartial <T,P extends Partial<T>, K extends keyof P> ( obj: T, part: P, key: K ) {
    return obj[key]=part[key]
}

因此,如果 key 是 keyof Partial ,它必须是 keyof T 你看到我错过了什么吗?

【问题讨论】:

    标签: typescript typescript-generics


    【解决方案1】:

    在这种情况下,key 不是keyof Partial&lt;T&gt; - 它的类型扩展了keyof P,其中P 扩展了 Partial&lt;T&gt;P 可能有比T 更多/不同的键,所以key 不能在这里用作T 的属性。

    假设你不想给T添加新的属性,就不需要有类型参数P,因为它可以从T本身推断出来。这里有两种解决方案,取决于您是否希望 objpart 获取 undefined 属性值:

    // no undefined values assigned from part
    function updateWithPartial<T, K extends keyof T>(obj: T, part: Partial<T>, key: K) {
      if (part[key] === undefined) throw new Error() // throw or do something else...
      return obj[key] = part[key] as T[K] // help compiler to understand, part[key] must be defined here
    }
    
    // possible undefined values assigned from part
    function updatePartialWithPartial<T, K extends keyof T>(obj: Partial<T>, part: Partial<T>, key: K) {
      return obj[key] = part[key]
    }
    

    好的,一些测试:

    declare const foo: { a: string }
    
    const res = updateWithPartial(foo, { a: "bar" }, "a") // string 
    const res2 = updatePartialWithPartial(foo, { a: "bar" }, "a") // string | undefined
    const res22 = updatePartialWithPartial(foo, {}, "a") // string | undefined
    

    Playground

    【讨论】:

    • 顺便说一句:不知道您的具体情况,如果您希望 part 包含一个特定的已定义属性并具有编译器强制类型而不是运行时检查,也许 Pick 是一个更好的选择.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 2015-11-27
    • 2021-08-21
    • 2019-08-11
    • 2021-11-26
    • 1970-01-01
    相关资源
    最近更新 更多