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

TypeScript:无法写入异类数组文字

  •  17
  • Spongman  · 技术社区  · 14 年前

    我需要什么类型的断言才能编译它?

    class Foo {}
    class Bar {}
    
    var f =
    [
        [Foo, [1, 2, 3]],
        [Bar, [7, 8, 9]],
    ];
    

    错误:

    Incompatible types in array literal expression
    
    3 回复  |  直到 14 年前
        1
  •  16
  •   Brian Terlson    14 年前

    这将起作用:

    class Foo {}
    class Bar {}
    
    var f: any[][] = [
        [Foo, [1, 2, 3]],
        [Bar, [7, 8, 9]],
    ];
    

    这表示您有一个二维数组,其值可以是任何值(Foo、Bar、其他数组等)。您还可以对嵌套数组使用类型断言:

    class Foo {}
    class Bar {}
    
    var f = [
        [<any>Foo, [1, 2, 3]],
        [<any>Bar, [7, 8, 9]],
    ];
    

    内部数组中单个any的存在迫使编译器将其类型推断为any[]。

        2
  •  10
  •   Eli Barzilay    10 年前

    它看起来像打字稿 做 现在拥有异构阵列。所以,既然 当我寻找这个时,这个问题首先出现了,因为它很难 要找到其他代码,请点击此处了解如何编写此代码:

    class Foo {}
    class Bar {}
    
    var f: [Foo|Bar, number[]][] =
        [[new Foo(), [1, 2, 3]],
         [new Bar(), [7, 8, 9]]];
    

    (现在,如果这沿着模仿表达式的类型语法的道路发展, 该类型还将获得 [Foo|Bar, [...number]][] …)

    它甚至可以与函数参数一起使用,因此这种类型检查很好:

    function foo([obj,nums]: [Foo|Bar, number[]]) {
      for (let i of nums) console.log(`i = ${i}`);
    }
    
    f.forEach(foo);
    

    以及极端版本:

    f.forEach(([obj,nums]: [Foo|Bar, number[]]) => {
      for (let i of nums) console.log(`i = ${i}`); });
    
        3
  •  2
  •   Chad    11 年前

    从Typescript 1.4开始,您可以进行类型联合。我能够做到这一点:

    function zip<T, X> (array1: T[], array2: X[]): (T|X)[][] {
        return array1.map(function (v: T, i: number) { return [v, array2[i]]; });
    }
    

    在您的案例中,您要寻找的具体类型是:

    (Foo|Bar|number[])[][]
    

    或者:

    (typeof Foo|typeof Bar|number[])[][]
    
    推荐文章