Γραφομηχανή: Δεν μπορεί να γράψει ετερογενή κατεξοχήν σειρά

ψήφοι
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