Semua bidang dalam JavaScript (dan dalam TypeScript) dapat memiliki nilai null
atau undefined
.
Anda dapat membuat bidang opsional yang berbeda dari nullable.
interface Employee1 {
name: string;
salary: number;
}
var a: Employee1 = { name: 'Bob', salary: 40000 }; // OK
var b: Employee1 = { name: 'Bob' }; // Not OK, you must have 'salary'
var c: Employee1 = { name: 'Bob', salary: undefined }; // OK
var d: Employee1 = { name: null, salary: undefined }; // OK
// OK
class SomeEmployeeA implements Employee1 {
public name = 'Bob';
public salary = 40000;
}
// Not OK: Must have 'salary'
class SomeEmployeeB implements Employee1 {
public name: string;
}
Dibandingkan dengan:
interface Employee2 {
name: string;
salary?: number;
}
var a: Employee2 = { name: 'Bob', salary: 40000 }; // OK
var b: Employee2 = { name: 'Bob' }; // OK
var c: Employee2 = { name: 'Bob', salary: undefined }; // OK
var d: Employee2 = { name: null, salary: 'bob' }; // Not OK, salary must be a number
// OK, but doesn't make too much sense
class SomeEmployeeA implements Employee2 {
public name = 'Bob';
}
typescript@next
sekarang.)"strict" : false
salary:number|null;
Jika Anda melakukannya,salary?:number; salary = null;
Anda akan mendapatkan kesalahan. Namun,salary = undefined;
akan berfungsi dengan baik dalam kasus ini. Solusi: gunakan Union yaitu '|'Jenis serikat ada dalam pikiran saya pilihan terbaik dalam hal ini:
EDIT: Agar ini berfungsi seperti yang diharapkan, Anda harus mengaktifkan
strictNullChecks
intsconfig
.sumber
Agar lebih seperti C # , tentukan
Nullable
jenisnya seperti ini:Bonus:
Untuk membuat
Nullable
berperilaku seperti tipe skrip bawaan, tentukan dalamglobal.d.ts
file definisi di folder sumber root. Jalan ini bekerja untuk saya:/src/global.d.ts
sumber
emp: Partial<Employee>
, kita dapat melakukanemp.id
atauemp.name
lain - lain tetapi jika kita memilikiemp: Nullable<Employee>
, kita tidak dapat melakukannyaemp.id
Cukup tambahkan tanda tanya
?
ke bidang opsional.sumber
Anda bisa menerapkan tipe yang ditentukan pengguna seperti berikut:
sumber
sumber
saya punya pertanyaan yang sama beberapa waktu lalu .. semua jenis di ts dapat dibatalkan, karena void adalah subtipe dari semua jenis (tidak seperti, misalnya, scala).
lihat apakah diagram alur ini membantu - https://github.com/bcherny/language-types-comparison#typescript
sumber
void
'subtipe semua jenis' ( tipe bawah ), lihat utas ini . Juga grafik yang Anda berikan untuk scala juga salah.Nothing
dalam scala sebenarnya adalah tipe terbawah. Naskah, atm, tidak memiliki tipe dasar sedangkan scala tidak .Jenis nullable dapat memanggil kesalahan runtime. Jadi saya pikir itu baik untuk menggunakan opsi kompiler
--strictNullChecks
dan menyatakannumber | null
sebagai tipe. juga dalam kasus fungsi bersarang, meskipun tipe input adalah nol, kompiler tidak dapat mengetahui apa yang bisa rusak, jadi saya sarankan gunakan!
(tanda exclamination).Referensi. https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-guards-and-type-assertions
sumber