Pembaruan 2019-05-15 (Pola Kode Peningkatan sebagai Alternatif)
Setelah bertahun-tahun menggunakan const
dan mendapatkan manfaat dari kode yang lebih fungsional, saya akan merekomendasikan untuk tidak menggunakan di bawah ini dalam banyak kasus. (Saat membangun objek, memaksa sistem tipe ke dalam tipe tertentu alih-alih membiarkannya menyimpulkan tipe sering merupakan indikasi bahwa ada sesuatu yang salah).
Sebagai gantinya saya akan merekomendasikan menggunakan const
variabel sebanyak mungkin dan kemudian menyusun objek sebagai langkah terakhir:
const id = GetId();
const hasStarted = true;
...
const hasFinished = false;
...
return {hasStarted, hasFinished, id};
- Ini dengan benar akan mengetik semuanya tanpa perlu mengetik secara eksplisit.
- Tidak perlu mengetik ulang nama bidang.
- Ini mengarah ke kode terbersih dari pengalaman saya.
- Ini memungkinkan kompiler untuk memberikan lebih banyak verifikasi status (misalnya, jika Anda kembali di beberapa lokasi, kompiler akan memastikan jenis objek yang sama selalu dikembalikan - yang mendorong Anda untuk mendeklarasikan seluruh nilai pengembalian di setiap posisi - memberikan penjelasan yang sangat jelas niat nilai itu).
Penambahan 2020-02-26
Jika Anda benar-benar membutuhkan jenis yang Anda dapat diinisialisasi dengan malas: Tandai itu adalah jenis gabungan yang dapat dibatalkan (nol atau Jenis). Sistem tipe akan mencegah Anda menggunakannya tanpa terlebih dahulu memastikan memiliki nilai.
Di tsconfig.json
, pastikan Anda mengaktifkan pemeriksaan nol yang ketat:
"strictNullChecks": true
Kemudian gunakan pola ini dan izinkan sistem tipe untuk melindungi Anda dari akses null / undefined yang tidak disengaja:
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
}
}
Jangan lakukan hal di bawah ini dalam 99% kasus:
Pembaruan 2016-02-10 - Untuk Menangani TSX (Terima Kasih @Josh)
Gunakan as
operator untuk TSX.
var obj = {
property: null as string
};
Contoh yang lebih panjang:
var call = {
hasStarted: null as boolean,
hasFinished: null as boolean,
id: null as number,
};
Jawaban Asli
Gunakan operator transmisi untuk membuat ringkas ini (dengan memberikan null ke jenis yang diinginkan).
var obj = {
property: <string> null
};
Contoh yang lebih panjang:
var call = {
hasStarted: <boolean> null,
hasFinished: <boolean> null,
id: <number> null,
};
Ini jauh lebih baik daripada memiliki dua bagian (satu untuk mendeklarasikan tipe, yang kedua untuk menyatakan default):
var callVerbose: {
hasStarted: boolean;
hasFinished: boolean;
id: number;
} = {
hasStarted: null,
hasFinished: null,
id: null,
};