Машинопись: не может написать гетерогенные литералы массива

голоса
13

какой тип утверждает, мне нужно, чтобы получить это составить?

class Foo {}
class Bar {}

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

ошибка:

Incompatible types in array literal expression
Задан 03/10/2012 в 20:58
источник пользователем
На других языках...                            


3 ответов

голоса
16

Это будет работать:

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]],
];

Наличие одной какой-либо во внутреннем массиве заставляет компилятор, чтобы вывести его тип, как и любой [].

Ответил 03/10/2012 в 21:05
источник пользователем

голоса
1

Похоже , что машинопись делает имеют разнородные массивы в настоящее время. Так, так как этот вопрос пришел первый , когда я смотрел на это, и так как трудно найти иначе, вот как этот код может быть записан в настоящее время:

class Foo {}
class Bar {}

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

(Теперь , если это идет вниз по дороге синтаксиса типа имитирующего выражения, тип будет также получить синтаксис [Foo|Bar, [...number]][]...)

Он даже работает с аргументами функции, так что typechecks отлично:

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}`); });
Ответил 23/12/2015 в 00:30
источник пользователем

голоса
0

По состоянию на машинопись 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[])[][]
Ответил 07/06/2015 в 14:53
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more