代码之家  ›  专栏  ›  技术社区  ›  prmph

扩展独占联合的typescript泛型参数

  •  0
  • prmph  · 技术社区  · 6 年前

    在typescript中,是否有方法定义只扩展联合类型的一个值的泛型参数?

    例如,假设我声明联合类型如下:

    type Any = "A" | "B"
    

    如果我在函数定义中使用类型,如下所示:

    const fn = <T extends Any>(arg: T[]) => {}
    

    然后 阿尔茨海默病 参数可以是包含“a”和“b”值的数组;例如,这将是有效的:

    let x = fn(["A", "B"])
    

    这就违背了在函数定义中使用泛型参数的目的(即限制 阿尔茨海默病 只有一个特定类型的参数数组)

    当然,我可以定义如下函数:

    const fn = (arg: "A"[] | "B"[]) => {}
    

    但是,如果联合中的组件类型数量很大,这可能是不实际的

    1 回复  |  直到 6 年前
        1
  •  1
  •   Titian Cernicova-Dragomir    6 年前

    有一个建议的特性允许您告诉编译器 T 是许多类型之一,而不是它们的联合。这个 issue 在讨论中标记为,因此可能添加一个+1。

    同时,如果 T 是使用条件类型的联合:

    type Any = "A" | "B"
    
    type UnionToIntersection<U> = 
      (U extends any ? (k: U)=>void : never) extends ((k: infer I)=>void) ? I : never
    type NoUnion<T, TError> = [T] extends [UnionToIntersection<T>] ? {} : TError
    
    type d = NoUnion<Any, ""> 
    const fn = <T extends Any>(arg: T[] & NoUnion<T, "Must be A or B not a union">) => { }
    
    fn(null as "A"[])
    fn(null as "B"[])
    fn(null as ("A" | "B")[]) //error Type 'Any[]' is not assignable to type '"Must be A or B not a union"'