Update 2019-05-15 (Verbessertes Codemuster als Alternative)
Nach vielen Jahren der Verwendung constund Nutzung von mehr Funktionscode würde ich in den meisten Fällen davon abraten, den folgenden Code zu verwenden. (Wenn Sie Objekte erstellen, ist es oft ein Hinweis darauf, dass etwas nicht stimmt, wenn Sie das Typsystem in einen bestimmten Typ zwingen, anstatt es auf Typen schließen zu lassen.)
Stattdessen würde ich empfehlen, constso viele Variablen wie möglich zu verwenden und dann das Objekt als letzten Schritt zusammenzustellen:
const id = GetId();
const hasStarted = true;
...
const hasFinished = false;
...
return {hasStarted, hasFinished, id};
- Dadurch wird alles ordnungsgemäß eingegeben, ohne dass eine explizite Eingabe erforderlich ist.
- Die Feldnamen müssen nicht erneut eingegeben werden.
- Dies führt zu dem saubersten Code aus meiner Erfahrung.
- Auf diese Weise kann der Compiler mehr Statusüberprüfungen durchführen. Wenn Sie beispielsweise an mehreren Orten zurückkehren, stellt der Compiler sicher, dass immer derselbe Objekttyp zurückgegeben wird. Dies ermutigt Sie, den gesamten Rückgabewert an jeder Position zu deklarieren Absicht dieses Wertes).
Ergänzung 2020-02-26
Wenn Sie tatsächlich einen Typ benötigen, den Sie träge initialisieren können: Markieren Sie, dass es sich um einen nullbaren Vereinigungstyp handelt (null oder Typ). Das Typsystem verhindert, dass Sie es verwenden, ohne vorher sicherzustellen, dass es einen Wert hat.
In tsconfig.json, stellen Sie sicher , können Sie strenge null Kontrollen:
"strictNullChecks": true
Verwenden Sie dann dieses Muster und lassen Sie sich vom Typsystem vor versehentlichem null / undefiniertem Zugriff 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
}
}
Führen Sie in 99% der Fälle Folgendes nicht aus:
Update 10.02.2016 - Umgang mit TSX (Danke @Josh)
Verwenden Sie den asOperator 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,
};
Ursprüngliche Antwort
Verwenden Sie den Cast-Operator, um dies kurz zu machen (indem Sie null auf den gewünschten Typ setzen).
var obj = {
property: <string> null
};
Ein längeres Beispiel:
var call = {
hasStarted: <boolean> null,
hasFinished: <boolean> null,
id: <number> null,
};
Dies ist viel besser als zwei Teile (einer zum Deklarieren von Typen, der zweite zum Deklarieren von Standardwerten):
var callVerbose: {
hasStarted: boolean;
hasFinished: boolean;
id: number;
} = {
hasStarted: null,
hasFinished: null,
id: null,
};