Menu

TypeScript optionale Parameter, Standardwerte und Rest

Einen TypeScript-Parameter mit ? optional machen, ihm einen Standardwert geben oder mit einem Rest-Parameter beliebig viele Argumente sammeln. Mit den Regeln zur Reihenfolge, weggelassen vs undefined, Options-Objekten und optionalen Parametern in Funktionstypen.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

Setze ? hinter einen Parameternamen, um ihn optional zu machen. Aufrufer dürfen ihn weglassen, und innerhalb der Funktion enthält sein Typ undefined.

TypeScript prüft die Anzahl der Argumente, ohne das ? wäre der erste Aufruf also ein Compilerfehler: Expected 2 arguments, but got 1. (TS2554).

Optionale Parameter können undefined sein

Weil ein Aufrufer ihn weglassen kann, ist der Typ eines optionalen Parameters innerhalb der Funktion T | undefined. Unter strictNullChecks musst du den Fall undefined behandeln, bevor du ihn als T verwendest.

Optional Chaining (?.) und Nullish Coalescing (??) sind hier die üblichen Werkzeuge. Ist der Ersatz ein fester Wert, ist ein Standardwert für den Parameter kürzer.

Standardwerte für Parameter

Ein Standardwert macht den Parameter für Aufrufer optional und gibt ihm innerhalb der Funktion einen Typ ohne undefined. Der Typ wird aus dem Standardwert abgeleitet, die Annotation ist also oft überflüssig.

Der Aufrufer sieht die Signatur repeat(text: string, times?: number, separator?: string). Standardwerte folgen der Regel von JavaScript: Sie greifen, wenn das Argument undefined ist, egal ob weggelassen oder ausdrücklich übergeben, und nicht bei null. Ein Standardausdruck kann frühere Parameter verwenden: function range(start: number, end = start + 10).

Regeln zur Reihenfolge der Parameter

DeklarationKompiliert?Hinweise
(a: number, b?: number)JaOptionale Parameter stehen am Ende
(a?: number, b: number)NeinTS1016: A required parameter cannot follow an optional parameter.
(a = 0, b: number)JaAber Aufrufer müssen f(undefined, 5) schreiben, um den Standardwert zu nutzen
(a: number, ...rest: number[])JaEin Rest-Parameter steht immer am Ende
(a?: number, ...rest: number[])JaOptional vor Rest ist erlaubt

Ein Parameter mit Standardwert vor einem Pflichtparameter ist erlaubt, aber umständlich. Sein Typ für Aufrufer wird zu number | undefined, und niemand schreibt gern undefined als Platzhalter. Brauchst du einen flexiblen ersten Parameter, nimm stattdessen ein Options-Objekt oder Funktionsüberladung.

Weggelassen vs undefined

x?: number und x: number | undefined sehen ähnlich aus und haben innerhalb der Funktion denselben Typ. Für den Aufrufer unterscheiden sie sich: Das erste darf weggelassen werden, das zweite muss übergeben werden.

Nimm | undefined für ein Pflichtargument, das keinen Wert haben darf, damit jeder Aufrufer darüber nachdenken muss. Nimm ?, wenn das Weglassen ein normaler Aufruf ist. (Die Meldung sagt wirklich „1 arguments“: So formuliert es TypeScript.)

Rest-Parameter

Ein Rest-Parameter, ...name: T[], sammelt beliebig viele Argumente in einem Array. Er muss der letzte Parameter sein.

Ein Array in feste Parameter zu spreaden ist strenger. Ein Rest-Parameter akzeptiert den Spread jedes number[], aber eine als (a: number, b: number) deklarierte Funktion akzeptiert nur den Spread eines Tupels, weil TypeScript die Länge kennen muss:

function point(x: number, y: number) { return { x, y }; }

const list = [3, 4];            // number[]
point(...list);
// error TS2556: A spread argument must either have a tuple type or be passed to a rest parameter.

const pair = [3, 4] as const;   // readonly [3, 4]
point(...pair);                 // fine

Ein Rest-Parameter kann auch einen Tupel-Typ haben, der jede Position typisiert: ...args: [name: string, age?: number].

Options-Objekte

Hat eine Funktion mehr als zwei oder drei optionale Parameter, verlieren Aufrufer den Überblick über die Positionen. Ein Options-Objekt mit Standardwerten liefert benannte Argumente ohne feste Reihenfolge.

Das = {} am Ende macht das ganze Objekt optional. Ohne es ist fetchData("/a") ein Compilerfehler (Expected 2 arguments, but got 1., TS2554), und in reinem JavaScript würde derselbe Aufruf zur Laufzeit einen TypeError werfen, weil Destructuring ein Objekt zum Lesen braucht.

Optionale Parameter in Callback-Typen

In einem Funktionstyp bedeutet ?: Der Aufrufer dieses Callbacks übergibt ihn vielleicht nicht. Es bedeutet nicht: Der Callback darf ihn auslassen, denn ein Callback kann nachfolgende Parameter immer ignorieren. Markiere Callback-Parameter also nicht als optional, nur damit Handler weniger Argumente nehmen können.

// Too loose: every handler must now cope with index being undefined
type Visit = (item: string, index?: number) => void;

// Right: the caller always passes both; handlers may use only item
type VisitStrict = (item: string, index: number) => void;
const log: VisitStrict = (item) => console.log(item);

Häufig gestellte Fragen

Wie macht man in TypeScript einen Parameter optional?

Setze ein ? hinter seinen Namen: function greet(name?: string). Aufrufer dürfen ihn weglassen, und in der Funktion ist sein Typ string | undefined, du prüfst ihn also vor der Verwendung. Ein Standardwert, name = "there", macht den Parameter ebenfalls optional und entfernt das undefined innerhalb der Funktion.

Darf in TypeScript ein optionaler Parameter vor einem Pflichtparameter stehen?

Nicht mit ?: (a?: number, b: number) ist der Fehler TS1016, "A required parameter cannot follow an optional parameter." Ein Parameter mit Standardwert darf vorn stehen, aber dann müssen Aufrufer ausdrücklich undefined übergeben, um den Standardwert zu nutzen, in der Praxis stehen optionale Parameter und solche mit Standardwert also am Ende.

Was ist der Unterschied zwischen x?: number und x: number | undefined?

Innerhalb der Funktion sind beide number | undefined. Der Unterschied liegt beim Aufruf: Mit x?: number kann das Argument weggelassen werden, mit x: number | undefined muss es übergeben werden, selbst wenn der Wert undefined ist. Es wegzulassen ergibt den Fehler TS2554.

Verwendet die Übergabe von null den Standardwert des Parameters?

Nein. JavaScript wendet einen Standardwert nur an, wenn das Argument undefined ist (weggelassen oder ausdrücklich übergeben). null ist ein Wert und bleibt erhalten. TypeScript lehnt null für einen number-Parameter unter strictNullChecks ohnehin ab.

Wie übergebe ich in TypeScript ein Array als einzelne Argumente?

Mit Spread: fn(...args). Bei einer Funktion mit festen Parametern muss das Array einen Tupel-Typ wie [number, number] haben oder aus as const stammen; ein number[] zu spreaden ergibt den Fehler TS2556, weil seine Länge unbekannt ist. In einen Rest-Parameter (...values: number[]) zu spreaden funktioniert immer.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S