Update 2019-05-15 (Verbesserte Code-Muster als Alternative)
Nach vielen Jahren der Nutzung const
und von funktionalerem Code zu profitieren, würde ich in den meisten Fällen davon abraten, meine ursprünglichen Antworten zu verwenden (die Überschriften unter diesem Abschnitt, d.h. bei der Erstellung von Objekten, das Typsystem in einen bestimmten Typ zu zwingen, anstatt es Typen ableiten zu lassen, ist oft ein Hinweis darauf, dass etwas falsch ist).
Stattdessen würde ich empfehlen, Folgendes zu verwenden const
Variablen so weit wie möglich zu reduzieren und dann im letzten Schritt das Objekt zu komponieren:
const id = getId();
const hasStarted = true;
...
const hasFinished = false;
...
return { hasStarted, hasFinished, id };
- Dadurch wird alles korrekt eingegeben, ohne dass eine explizite Eingabe erforderlich ist.
- Sie müssen die Feldtypen nicht erneut eingeben.
- Dies führt meiner Erfahrung nach zum saubersten Code.
- Dies ermöglicht dem Compiler eine bessere Zustandsüberprüfung (wenn Sie z. B. an mehreren Stellen zurückkehren, stellt der Compiler sicher, dass immer derselbe Objekttyp zurückgegeben wird - was Sie dazu ermutigt, den gesamten Rückgabewert an jeder Position zu deklarieren - was eine völlig klare Absicht für diesen Wert darstellt).
Bonus: Optionale Felder 2022-09-29
const id = getId();
const optionalField = getOptionalValue();
return {
id,
// This will always exist as a key in the object but it might be undefined
optionalField,
// This will only exist as a key in the object if it has a truthy value
...optionalField2 ? { optionalField } : {},
// This will only exist as a key in the object if it is not null or undefined
...optionalField2 != null ? { optionalField } : {},
};
Zusatz 2020-02-26
Wenn Sie tatsächlich eine Art, die Sie können lazily initialisiert werden müssen: Markieren Sie, dass es sich um einen nullbaren Union-Typ (null oder Type) handelt. Das Typsystem wird Sie daran hindern, ihn zu verwenden, ohne vorher sicherzustellen, dass er einen Wert hat.
Unter tsconfig.json
stellen Sie sicher, dass Sie strenge Nullprüfungen aktivieren:
"strictNullChecks": true
Dann verwenden Sie dieses Muster und erlauben Sie dem Typsystem, Sie vor versehentlichem null/undefiniertem Zugriff zu schützen:
const state = {
instance: null as null | ApiService,
// OR
// instance: undefined as undefined | ApiService,
};
const useApi = () => {
// If I try to use it here, the type system requires a safe way to access it
// Simple lazy-initialization
const api = state?.instance ?? (state.instance = new ApiService());
api.fun();
// Also here are some ways to only access it if it has value:
// The 'right' way: Typescript 3.7 required
state.instance?.fun();
// Or the old way: If you are stuck before Typescript 3.7
state.instance && state.instance.fun();
// Or the long winded way because the above just feels weird
if (state.instance) { state.instance.fun(); }
// Or the I came from C and can't check for nulls like they are booleans way
if (state.instance != null) { state.instance.fun(); }
// Or the I came from C and can't check for nulls like they are booleans
// AND I was told to always use triple === in javascript even with null checks way
if (state.instance !== null && state.instance !== undefined) { state.instance.fun(); }
};
class ApiService {
fun() {
// Do something useful here
}
}
In 99 % der Fälle sollten Sie die folgenden Schritte nicht durchführen:
Update 2016-02-10 - Zum Umgang mit TSX (Danke @Josh)
Verwenden Sie die as
Betreiber für TSX.
var obj = {
property: null as string
};
Ein längeres Beispiel:
var call = {
hasStarted: null as boolean,
hasFinished: null as boolean,
id: null as number,
};
Original-Antwort
Verwenden Sie den Cast-Operator, um dies kurz und bündig zu machen (durch Casting von null auf den gewünschten Typ).
var obj = {
property: <string> null
};
Ein längeres Beispiel:
var call = {
hasStarted: <boolean> null,
hasFinished: <boolean> null,
id: <number> null,
};
Das ist viel besser als zwei Teile zu haben (einen für die Deklaration von Typen, den zweiten für die Deklaration von Standardwerten):
var callVerbose: {
hasStarted: boolean;
hasFinished: boolean;
id: number;
} = {
hasStarted: null,
hasFinished: null,
id: null,
};