代码之家  ›  专栏  ›  技术社区  ›  Alex Wayne

键入一个函数,该函数接受与对象类型匹配的键和值,然后使用它们

  •  1
  • Alex Wayne  · 技术社区  · 6 年前

    我有一个对象类型,我希望有一个函数接受 key 从该对象类型,以及 value 必须是对应于 钥匙 .

    我得到了这个 主要地 工作,直到您实际使用这些值,然后Flow会忘记需要它们进行匹配。

    // @flow
    
    type Obj = {
      str: string,
      num: number,
    }
    
    const obj: Obj = {
      str: '',
      num: 0,
    }
    
    function foo<KEY: $Keys<Obj>>(
      key: KEY,
      value: $ElementType<Obj, KEY>
    ) {
      obj[key] = value
      //         ^ Cannot assign `value` to `obj[key]` because string [1]
      //           is incompatible with number [2].
    }
    
    // Good
    foo('str', 'good')
    foo('num', 123)
    
    // Bad
    foo('str', 456) // ERROR: as expected.
    foo('num', 'bad') // ERROR: as expected.
    

    Try flow link

    我怎么让Flow知道这其实很好,因为 只是 验证键和值类型是否匹配?

    1 回复  |  直到 6 年前
        1
  •  3
  •   frontendgirl    6 年前

    KEY string

    type Obj = {
      str: string,
      num: number,
    }
    
    const obj: Obj = {
      str: '',
      num: 0,
    }
    
    function foo<KEY: string>(
      key: KEY,
      value: $ElementType<Obj, KEY>
    ) {
      obj[key] = value
    }
    
    // Good
    foo('str', 'good')
    foo('num', 123)
    
    // BAD
    //foo('str', 456)
    //foo('num', 'bad')
    

    key Obj value $ElementType<Obj, KEY>

    flow playground