【问题标题】:how to implement a type-safe generic setter如何实现类型安全的泛型设置器
【发布时间】:2020-10-31 22:05:04
【问题描述】:

游乐场是here

我正在尝试在 Typescript 中定义一个通用类型安全的 setter 函数。 类似于以下内容:

 type A = {a1: string, a2: number}
 let a: A = {a1: 'foo', a2: 42};
 setPropertyOnA('a1', 42);    // this should fail to type-check
 setPropertyOnA('a2', '43');  // ditto

以下是我所做的(上面给出了游乐场链接):

type PropType<TObj, TProp extends keyof TObj> = TObj[TProp]; 

type A = {a1: string, a2: number}

let a: A = {a1: 'foo', a2: 42};

function setPropertyOnA(property: keyof A
                      , v: PropType<A, typeof property>): void {

    a[property] = v; // Q1. why is this failing?
}

setPropertyOnA('a1', 42);    // Q2. this should fail to type-check
setPropertyOnA('a2', '43');  // ditto

PropType 实用程序是从 here 复制而来的

在标有Q1的那一行我得到:

类型 'PropType' 不能分配给类型 'never'。
类型“字符串”不可分配给类型“从不”。(2322)

在标有Q2 的两行中,我原以为 Typescript 会抱怨,但事实并非如此。

我做错了什么?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    那是因为您应该使用通用锁定特定键。您也可以在不使用PropType 的情况下简化代码:

    function setPropertyOnA<T extends keyof A>(property: T, v: A[T]): void {
         a[property] = v; // now it works
    }
    
    setPropertyOnA('a1', 42);    // it's failed
    setPropertyOnA('a2', '43');  // it's failed
    

    此外,您可以编写一个函数来设置属性,而不仅仅是针对特定类型的对象:

    function setProperty<T, K extends keyof T>(obj: T, property: K, v: T[K]): void {
         obj[property] = v;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      • 2019-06-12
      • 1970-01-01
      • 2018-10-29
      • 2013-05-17
      相关资源
      最近更新 更多