Todos los campos en JavaScript (y en TypeScript) pueden tener el valor null
o undefined
.
Puede hacer que el campo sea opcional, que es diferente de anulable.
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;
}
Comparar con:
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
ahora.)"strict" : false
salary:number|null;
Si lo hacesalary?:number; salary = null;
, obtendrá un error. Sin embargo,salary = undefined;
funcionará bien en este caso. Solución: use Union, es decir, '|'El tipo de unión es, en mi opinión, la mejor opción en este caso:
EDIT: Para que esto funcione como se esperaba, se debe permitir que el
strictNullChecks
entsconfig
.fuente
Para ser más parecido a C # , defina el
Nullable
tipo de esta manera:Prima:
Para hacer que se
Nullable
comporte como un tipo de Typecript incorporado, defínalo en unglobal.d.ts
archivo de definición en la carpeta de origen raíz. Este camino funcionó para mí:/src/global.d.ts
fuente
emp: Partial<Employee>
, podemos haceremp.id
oemp.name
etc, pero si tenemosemp: Nullable<Employee>
, no podemos haceremp.id
Simplemente agregue un signo de interrogación
?
al campo opcional.fuente
Simplemente puede implementar un tipo definido por el usuario como el siguiente:
fuente
fuente
Tuve esta misma pregunta hace un tiempo ... todos los tipos en ts son anulables, porque void es un subtipo de todos los tipos (a diferencia, por ejemplo, scala).
vea si este diagrama de flujo ayuda - https://github.com/bcherny/language-types-comparison#typescript
fuente
void
ser 'subtipo de todos los tipos' ( tipo inferior ), consulte este hilo . Además, el gráfico que proporcionó para scala también es incorrecto.Nothing
en scala es, de hecho, el tipo de fondo. Typecript, atm, no tiene tipo de fondo mientras que scala sí .El tipo anulable puede invocar un error de tiempo de ejecución. Así que creo que es bueno usar una opción de compilador
--strictNullChecks
y declararnumber | null
como tipo. También en el caso de la función anidada, aunque el tipo de entrada es nulo, el compilador no puede saber qué podría romper, por lo que recomiendo su uso!
(signo de exclamación).Referencia. https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-guards-and-type-assertions
fuente