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

Posted

技术标签:

【中文标题】TypeScript:无法编写异构数组文字【英文标题】:TypeScript: can't write heterogeneous array literals 【发布时间】:2012-09-24 19:39:04 【问题描述】:

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

class Foo 
class Bar 

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

错误:

Incompatible types in array literal expression

【问题讨论】:

【参考方案1】:

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

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`); );

【讨论】:

【参考方案2】:

从 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[])[][]

【讨论】:

这仍然是一个齐次数组。 (例如,在迭代 IIUC 始终是数组的第二个元素之前,您仍然需要进行冗余检查。)【参考方案3】:

这将起作用:

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[]。

【讨论】:

我希望数组默认被推断为 any[]。这些是 javascript [object Array]s,而不是 IEnumerable&lt;T&gt; 这实际上意味着 Typescript 不是 Javascript 的超集 @JasonDenizac 我个人不同意,通常在 TypeScript 中,拥有异构数组是一个错误,如果你必须明确说明异构数组的方式,你就不太可能搞砸了。 现在可以为此编写适当的类型,请参阅我的回答。 (而@semicolon,这是错误的,因为 TS 有一个明确的目标,即允许使用普通的 JS 习语(并返回两个(不同的)值,在它们周围加上一个数组而不是对象包装器当然很有用)。)

以上是关于TypeScript:无法编写异构数组文字的主要内容,如果未能解决你的问题,请参考以下文章

swift中的异构集合文字

在 TypeScript 中使用类型变量访问对象文字不起作用

TypeScript:来自字符串联合文字数组类型,不允许数组中存在任何冗余值

如何在 Typescript 的对象文字中定义“任何”数组? [复制]

如何在 TypeScript 中将 Set 转换为数组

TypeScript数组到字符串文字类型