【问题标题】:Typescript , How to infer type from another property value?Typescript,如何从另一个属性值推断类型?
【发布时间】:2022-04-21 04:56:12
【问题描述】:

例如,我有一个带有属性的接口:keyvalue,我想通过键来推断值类型。

interface Obj { a: number; b: string }

interface Param<K extends keyof Obj> {
  key: K
  value: Obj[K] // I want to infer this type
}

const p: Param<keyof Obj> = {
  key: 'a',
  value: '', // typescript can't infer this type, expect number
}

我该怎么做?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    Obj[K] 表示可以通过将Obj 索引为K 中的任何值获得的值,而不仅仅是key 中的值。

    因此,要使用这种结构,您需要指定更紧密地使用哪个键:

    interface Obj { a: number; b: string }
    
    interface Param<K extends keyof Obj> {
      key: K
      value: Obj[K]
    }
    
    const p: Param<'a'> = { // changed line
      key: 'a',
      value: '', // error
    }
    

    遗憾的是,无法推断出泛型参数。


    如果您已经知道 Obj 中的内容,那么可能有更好的方法来做到这一点。

    interface AParam {
        key: 'a'
        value: number
    }
    
    interface BParam {
        key: 'b'
        value: string
    }
    
    type Param = AParam | BParam;
    
    const p: Param = {
      key: 'a',
      value: '', // error
    }
    

    如果您需要变量p 能够容纳key,但仍然让value 是正确的类型,这是唯一可行的方法。

    【讨论】:

      【解决方案2】:

      您可以在mapped types 的帮助下实现这一目标。

      type ParamHelper<T> = { [K in keyof T]: { key: K; value: T[K] } };
      type Param<T> = ParamHelper<T>[keyof ParamHelper<T>];
      

      【讨论】:

        【解决方案3】:
        
        type param<o> = {
            [k in keyof o]: {
                key: k,
                value: o[k]
            }
        }[keyof o];
        const o = {a:1, b:2} as const
        const a: param<typeof o> ={
            key:'a',
            value:1
        }
        

        【讨论】:

          猜你喜欢
          • 2022-12-18
          • 2021-06-09
          • 1970-01-01
          • 2020-08-16
          • 1970-01-01
          • 2020-07-19
          • 1970-01-01
          • 2021-03-20
          • 2017-03-08
          相关资源
          最近更新 更多