Todos os campos em JavaScript (e em TypeScript) podem ter o valor null
ou undefined
.
Você pode tornar o campo opcional, diferente de nulo.
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;
}
Compare com:
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
agora)."strict" : false
salary:number|null;
Se você o fizersalary?:number; salary = null;
, receberá um erro. No entanto,salary = undefined;
funcionará bem neste caso. Solução: use Union, ou seja, '|'O tipo de união é, na minha opinião, a melhor opção neste caso:
EDIT: Para que isso funcione conforme o esperado, você deve habilitar o
strictNullChecks
intsconfig
.fonte
Para ser mais parecido com C # , defina o
Nullable
tipo assim:Bônus:
Para se
Nullable
comportar como um tipo de TypeScript interno, defina-o em umglobal.d.ts
arquivo de definição na pasta de origem raiz. Esse caminho funcionou para mim:/src/global.d.ts
fonte
emp: Partial<Employee>
, podemos fazeremp.id
ouemp.name
etc, mas se tivermosemp: Nullable<Employee>
, não podemos fazeremp.id
Basta adicionar um ponto de interrogação
?
ao campo opcional.fonte
Você pode apenas implementar um tipo definido pelo usuário, como o seguinte:
fonte
fonte
Eu tive essa mesma pergunta há algum tempo .. todos os tipos em ts são anuláveis, porque void é um subtipo de todos os tipos (diferente de, por exemplo, scala).
veja se este fluxograma ajuda - https://github.com/bcherny/language-types-comparison#typescript
fonte
void
ser 'subtipo de todos os tipos' ( tipo inferior ), consulte este tópico . Além disso, o gráfico que você forneceu para o scala também está incorreto.Nothing
em scala é, de fato, o tipo inferior. Datilografado, atm, não têm tipo de fundo, enquanto scala faz .O tipo anulável pode chamar um erro de tempo de execução. Então, acho bom usar uma opção de compilador
--strictNullChecks
e declararnumber | null
como tipo. também no caso de função aninhada, embora o tipo de entrada seja nulo, o compilador não pode saber o que poderia quebrar, por isso recomendo o uso!
(ponto de exclamação).Referência. https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-guards-and-type-assertions
fonte