Jawaban:
Semua bidang dalam JavaScript (dan dalam TypeScript) dapat memiliki nilai nullatau 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';
}
"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:
interface Employee{
id: number;
name: string;
salary: number | null;
}
// Both cases are valid
let employe1: Employee = { id: 1, name: 'John', salary: 100 };
let employe2: Employee = { id: 1, name: 'John', salary: null };
EDIT: Agar ini berfungsi seperti yang diharapkan, Anda harus mengaktifkan strictNullChecksin tsconfig.
Agar lebih seperti C # , tentukanNullable jenisnya seperti ini:
type Nullable<T> = T | null;
interface Employee{
id: number;
name: string;
salary: Nullable<number>;
}
Bonus:
Untuk membuat Nullableberperilaku seperti tipe skrip bawaan, tentukan dalam global.d.tsfile definisi di folder sumber root. Jalan ini bekerja untuk saya:/src/global.d.ts
emp: Partial<Employee>, kita dapat melakukan emp.idatau emp.namelain - lain tetapi jika kita memiliki emp: Nullable<Employee>, kita tidak dapat melakukannyaemp.id
Cukup tambahkan tanda tanya ?ke bidang opsional.
interface Employee{
id: number;
name: string;
salary?: number;
}
Anda bisa menerapkan tipe yang ditentukan pengguna seperti berikut:
type Nullable<T> = T | undefined | null;
var foo: Nullable<number> = 10; // ok
var bar: Nullable<number> = true; // type 'true' is not assignable to type 'Nullable<number>'
var baz: Nullable<number> = null; // ok
var arr1: Nullable<Array<number>> = [1,2]; // ok
var obj: Nullable<Object> = {}; // ok
// Type 'number[]' is not assignable to type 'string[]'.
// Type 'number' is not assignable to type 'string'
var arr2: Nullable<Array<string>> = [1,2];
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
void'subtipe semua jenis' ( tipe bawah ), lihat utas ini . Juga grafik yang Anda berikan untuk scala juga salah. Nothingdalam 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 --strictNullChecksdan menyatakan number | nullsebagai 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).
function broken(name: string | null): string {
function postfix(epithet: string) {
return name.charAt(0) + '. the ' + epithet; // error, 'name' is possibly null
}
name = name || "Bob";
return postfix("great");
}
function fixed(name: string | null): string {
function postfix(epithet: string) {
return name!.charAt(0) + '. the ' + epithet; // ok
}
name = name || "Bob";
return postfix("great");
}
Referensi. https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-guards-and-type-assertions
typescript@nextsekarang.)