Оновити 2019-05-15 (вдосконалений шаблон коду як альтернатива)
Після багатьох років використання const
та отримання користі від більш функціонального коду я б рекомендував не використовувати наведене нижче у більшості випадків. (Будуючи об'єкти, примушування системи типів до певного типу замість того, щоб робити висновки типів, часто є ознакою того, що щось не так).
Натомість я рекомендував би const
якомога більше використовувати змінні, а потім скласти об'єкт як останній крок:
const id = GetId();
const hasStarted = true;
...
const hasFinished = false;
...
return {hasStarted, hasFinished, id};
- Це дозволить правильно ввести все без необхідності явного введення тексту.
- Не потрібно повторно вводити назви полів.
- Це призводить до найчистішого коду з мого досвіду.
- Це дозволяє компілятору забезпечити більшу перевірку стану (наприклад, якщо ви повернетесь у декілька місцеположень, компілятор забезпечить, щоб завжди повертався один і той же тип об'єкта - що спонукає вас оголосити все повернене значення на кожній позиції - надаючи ідеально чітке намір цієї цінності).
Доповнення 2020-02-26
Якщо вам дійсно потрібен тип, який ви можете лінь ініціалізувати: Позначте, що це зведений тип об'єднання (null або Type). Система типу не дозволить вам використовувати її, не попередньо переконавшись, що вона має значення.
У цьому tsconfig.json
переконайтеся, що ви включили строгі нульові перевірки:
"strictNullChecks": true
Потім використовуйте цей шаблон і дозвольте системі типу захистити вас від випадкового нульового / невизначеного доступу:
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
}
}
Не робіть наступного в 99% випадків:
Оновлення 2016-02-10 - для обробки TSX (спасибі @Josh)
Використовуйте as
оператора для TSX.
var obj = {
property: null as string
};
Більш довгий приклад:
var call = {
hasStarted: null as boolean,
hasFinished: null as boolean,
id: null as number,
};
Оригінальний відповідь
Скористайтеся оператором кадру, щоб зробити цей короткий (за допомогою нульового значення нульового типу).
var obj = {
property: <string> null
};
Більш довгий приклад:
var call = {
hasStarted: <boolean> null,
hasFinished: <boolean> null,
id: <number> null,
};
Це набагато краще, ніж мати дві частини (одна для оголошення типів, друга для оголошення за замовчуванням):
var callVerbose: {
hasStarted: boolean;
hasFinished: boolean;
id: number;
} = {
hasStarted: null,
hasFinished: null,
id: null,
};