Güncelleme 2019-05-15 (Alternatif Olarak Geliştirilmiş Kod Modeli)
Uzun yıllar kullanıldıktan const
ve daha işlevsel kodlardan yararlandıktan sonra, çoğu durumda aşağıdakileri kullanmamanızı tavsiye ederim. (Nesneleri oluştururken, yazı sistemini türler çıkarmasına izin vermek yerine belirli bir türe zorlamak genellikle bir şeyin yanlış olduğunun bir göstergesidir).
Bunun yerine const
değişkenleri olabildiğince kullanmanızı ve ardından nesneyi son adım olarak oluşturmanızı öneririm :
const id = GetId();
const hasStarted = true;
...
const hasFinished = false;
...
return {hasStarted, hasFinished, id};
- Bu, açıkça yazmaya gerek olmadan her şeyi düzgün bir şekilde yazacaktır.
- Alan adlarının yeniden yazılmasına gerek yoktur.
- Bu benim deneyim en temiz kodu yol açar.
- Bu, derleyicinin daha fazla durum doğrulaması sağlamasına izin verir (örneğin, birden çok konuma geri dönerseniz, derleyici her zaman aynı tür nesnenin döndürülmesini sağlar - bu, her bir konumdaki tüm dönüş değerini bildirmenizi sağlar - mükemmel bir netlik sağlar. bu değerin niyeti).
İlave 2020-02-26
Tembel olarak başlatılabileceğiniz bir türe gerçekten ihtiyacınız varsa: Boş değerli bir birleşim türü (null veya Tür) olduğunu işaretleyin. Tip sistemi, önce bir değere sahip olduğundan emin olmadan onu kullanmanızı engeller.
İçinde tsconfig.json
, katı boş denetimleri etkinleştirdiğinizden emin olun:
"strictNullChecks": true
Ardından bu deseni kullanın ve tür sisteminin sizi yanlışlıkla boş / tanımsız erişimden korumasına izin verin:
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
}
}
Vakaların% 99'unda aşağıdakileri yapmayın:
Güncelleme 2016-02-10 - TSX ile İlgili (Teşekkürler @Josh)
as
TSX için operatörü kullanın .
var obj = {
property: null as string
};
Daha uzun bir örnek:
var call = {
hasStarted: null as boolean,
hasFinished: null as boolean,
id: null as number,
};
Orijinal Yanıt
Bu özlü yapmak için döküm operatörünü kullanın (istenen türe boş döküm yaparak).
var obj = {
property: <string> null
};
Daha uzun bir örnek:
var call = {
hasStarted: <boolean> null,
hasFinished: <boolean> null,
id: <number> null,
};
Bu, iki parçaya sahip olmaktan çok daha iyidir (biri bildirmek için, diğeri varsayılanları bildirmek için):
var callVerbose: {
hasStarted: boolean;
hasFinished: boolean;
id: number;
} = {
hasStarted: null,
hasFinished: null,
id: null,
};