Typen bei der Destrukturierung von Arrays


73
function f([a,b,c]) {
  // this works but a,b and c are any
}

ist es möglich so etwas zu schreiben?

function f([a: number,b: number,c: number]) {
  // being a, b and c typed as number 
}

1
Ich brauche verschiedene Datentypen
bis zum

Antworten:


122

Dies ist die richtige Syntax zum Destrukturieren eines Arrays in einer Argumentliste:

function f([a,b,c]: [number, number, number]) {

}

1
Während dieser Code die Frage möglicherweise beantwortet, verbessert die Bereitstellung eines zusätzlichen Kontexts darüber, warum und / oder wie dieser Code die Frage beantwortet, ihren langfristigen Wert.
JAL

Können Sie diese Syntax verkürzen, wenn alle Parameter vom gleichen Typ sind? Etwas in den Zeilen von f ([a, b, c]: [number]) {...}
filipbarak

3
@ Filipbarakf([a, b, c]: number[])
Michael Mrozek

11

Ja, so ist es. In TypeScript tun Sie dies auf einfache Weise mit Array-Typen und erstellen Tupel.

type StringKeyValuePair = [string, string];

Sie können tun, was Sie wollen, indem Sie das Array benennen:

function f(xs: [number, number, number]) {}

Aber Sie würden den interalen Parameter nicht benennen. Eine andere Möglichkeit ist die paarweise Destrukturierung:

function f([a,b,c]: [number, number, number]) {}

6

Mit TypeScript 4.0 können Tupeltypen jetzt Beschriftungen bereitstellen

type Range = [start: number, end: number]

2

Mein Code war so etwas wie unten

type Node = { 
    start: string;
    end: string;
    level: number;
};

const getNodesAndCounts = () => { 
    const nodes : Node[]; 
    const counts: number[];
    // ... code here

return [nodes, counts];
}

const [nodes, counts] = getNodesAndCounts(); // problematic line needed type

Typoskript gab mir einen Fehler in der Zeile unter TS2349: Es kann kein Ausdruck aufgerufen werden, dessen Typ keine Aufrufsignatur hat.

nodes.map(x => { 
//some mapping; 
    return x;
);

Das Ändern der Zeile nach unten löste mein Problem.

const [nodes, counts] = <Node[], number[]>getNodesAndCounts();

2

Als einfache Antwort möchte ich hinzufügen, dass Sie dies tun können:

function f([a,b,c]: number[]) {}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.