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

具有条件类型的简单函数

  •  1
  • John  · 技术社区  · 6 年前

    以下功能基本上从 typescript handbook section on using conditional types ,但它不起作用:

    function test<T extends boolean>(a: T): T extends true ? string : number {
      return a ? '1' : 1
    }
    

    Typescript报告:

    Type '1 | "1"' is not assignable to type 'T extends true ? string : number'.
      Type '1' is not assignable to type 'T extends true ? string : number'.
    

    我想我遗漏了一些明显的东西。如何构造此函数,以便typescript根据函数的参数正确推断类型?

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

    简而言之,答案是不能。没有值可以分配给未解析的条件类型(仍然依赖于自由泛型类型变量的条件类型)。唯一可以做的就是使用类型断言。

    function test<T extends boolean>(a: T): T extends true ? string : number {
      return (a ? '1' : 1)  as any
    }
    

    条件类型在表示参数之间的关系时很有用,但在实现函数时却没有帮助。另一种方法是使用更为宽松的实现签名。

    function test<T extends boolean>(a: T): T extends true ? string : number
    function test(a: boolean): number | string {
        return (a ? '1' : 1)
    }
    
        2
  •  2
  •   artem    6 年前

    它将有不同的行为相比 test 这是在您的问题中声明的,即当编译时类型未知时,它将推断联合类型。仍然不会检查实现是否符合条件类型逻辑,但是没有错误,也不需要类型断言:

    interface Selector {
        t: string;
        f: number;
    }
    
    function test<T extends boolean>(a: T): Selector[T extends true ? 't' : 'f'] {
      // NOTE: not checked that is returns correct type actually
      return a ? '1' : 1
    }
    
    
    const t1 = test(true);  // string
    const t2 = test(false); // number
    declare var b: boolean;
    const t3 = test(b); // string | number, which may or may not be what you want
    
    推荐文章