Обновление 2019-05-15 (улучшенный шаблон кода в качестве альтернативы)
После многих лет использования const
и использования более функционального кода я рекомендовал бы в большинстве случаев не использовать приведенное ниже. (При построении объектов принудительное использование системы типов в конкретном типе вместо того, чтобы позволять выводить типы, часто является признаком того, что что-то не так).
Вместо этого я бы рекомендовал использовать const
переменные в максимально возможной степени, а затем составить объект как последний шаг:
const id = GetId();
const hasStarted = true;
...
const hasFinished = false;
...
return {hasStarted, hasFinished, id};
- Это будет правильно печатать все без необходимости явной печати.
- Нет необходимости перепечатывать имена полей.
- Это приводит к чистому коду из моего опыта.
- Это позволяет компилятору обеспечить больше проверки состояния (например, если вы вернетесь в нескольких местах, компилятор будет гарантировать, что всегда возвращается один и тот же тип объекта - что побуждает вас объявлять все возвращаемое значение в каждой позиции - давая совершенно ясную информацию). намерение этой ценности).
Дополнение 2020-02-26
Если вам действительно нужен тип, который можно лениво инициализировать: отметьте, что это объединяемый тип, допускающий значение NULL (нуль или тип). Система типов не позволит вам использовать ее, не убедившись, что она имеет значение.
В 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 (спасибо @ Джош)
Используйте as
оператор для TSX.
var obj = {
property: null as string
};
Более длинный пример:
var call = {
hasStarted: null as boolean,
hasFinished: null as boolean,
id: null as number,
};
Оригинальный ответ
Используйте оператор приведения, чтобы сделать это кратким (приведя значение null к нужному типу).
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,
};