代码之家  ›  专栏  ›  技术社区  ›  Stav Alfi

如何创建“内部泛型”类型?

  •  0
  • Stav Alfi  · 技术社区  · 5 年前
    type DnsRecords = {
      [key: string]: {
        component: FC<A>
        toInlineValue: (data: A) => string
        fromInlineValue: (record: string) => A
      }
    }
    

    但对于每个子对象, A 可能会有所不同。

    例如:

    type DnsRecords = {
      a: {
        component: FC<{ a: number }>
        toInlineValue: (data: { a: number }) => string
        fromInlineValue: (record: string) => { a: number }
      }
      b: {
        component: FC<string | number>
        toInlineValue: (data: string | number) => string
        fromInlineValue: (record: string) => string | number
      }
    }
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   Titian Cernicova-Dragomir    5 年前

    没有办法直接这么做。您需要一个额外的泛型类型来 DnsRecords 要包含每个属性的类型,请执行以下操作:

    type DnsRecords<T> = {
        [P in keyof T]: {
            component: FC<T[P]>
            toInlineValue: (data: T[P]) => string
            fromInlineValue: (record: string) => T[P]
    }
    }
    type V = DnsRecords<{
        a: { foo: string },
        b: { bar: string }
    }>
    

    你可以创建一个函数来帮助推断 T 但如果使用不同的值,编译器将推断属性的并集:

    function createDns<T>(dns: DnsRecords<T>) {
        return dns;
    }
    
    type A = { x: string }
    type B = { x2: string }
    
    let o = createDns({ // T is { a: A | B; }
        a: {
            component: (p: A) => { },
            toInlineValue: (data: B) => "",
            fromInlineValue: (r) => ({ x: r })
        }
    })