TypeScript:无法编写异构数组文字

Spo*_*man 14 typescript

我需要什么类型的断言来编译?

class Foo {}
class Bar {}

var f =
[
    [Foo, [1, 2, 3]],
    [Bar, [7, 8, 9]],
];
Run Code Online (Sandbox Code Playgroud)

错误:

Incompatible types in array literal expression
Run Code Online (Sandbox Code Playgroud)

小智 16

这将有效:

class Foo {}
class Bar {}

var f: any[][] = [
    [Foo, [1, 2, 3]],
    [Bar, [7, 8, 9]],
];
Run Code Online (Sandbox Code Playgroud)

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

class Foo {}
class Bar {}

var f = [
    [<any>Foo, [1, 2, 3]],
    [<any>Bar, [7, 8, 9]],
];
Run Code Online (Sandbox Code Playgroud)

内部数组中存在单个any会强制编译器将其类型推断为任何[].

  • 这实际上意味着Typescript不是Javascript的超集 (14认同)
  • 我更喜欢默认情况下数组被推断为任何[].这些是JavaScript` [object Array],而不是`IEnumerable <T>`. (3认同)

Eli*_*lay 10

看起来打字稿现在确实异构数组。因此,由于当我寻找这个问题时首先出现了这个问题,并且因为否则很难找到它,所以现在可以如何编写此代码:

class Foo {}
class Bar {}

var f: [Foo|Bar, number[]][] =
    [[new Foo(), [1, 2, 3]],
     [new Bar(), [7, 8, 9]]];
Run Code Online (Sandbox Code Playgroud)

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

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

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

f.forEach(foo);
Run Code Online (Sandbox Code Playgroud)

以及极端版本:

f.forEach(([obj,nums]: [Foo|Bar, number[]]) => {
  for (let i of nums) console.log(`i = ${i}`); });
Run Code Online (Sandbox Code Playgroud)