null e endefined - TypeScript
Assim como no JavaScript, no TypeScript existem os tipos especiais undefined
null
undefined
null
O uso de undefined
null
strictNullChecks
false
let a: undefined = undefined;
let b: null = null;
Na prática, podemos atribuir os valores undefined
null
number
let x: number = undefined;
console.log(x);
x = null;
console.log(x);
x = 5;
console.log(x);
Nesse contexto, null
undefined
null
undefined
null
Contudo, a ausência de verificações desses tipos pelo compilador pode ser uma fonte de bugs. Por isso, é comum utilizar o parâmetro strictNullChecks
--strictNullChecks
Ou definindo o valor true
tsconfig.json
{
"compilerOptions": {
"target": "es2015",
"noImplicitAny": true,
"noEmitOnError": true,
"strictNullChecks": true,
"outFile": "app.js"
}
}
Nesse cenário, se tentarmos atribuir um valor do tipo undefined
null
let x: number = undefined;
console.log(x);
x = null;
console.log(x);
x = 5;
console.log(x);
O compilador produzirá as seguintes mensagens de erro:
app.ts:1:5 - error TS2322: Type 'undefined' is not assignable to type 'number'. let x: number = undefined; app.ts:3:1 - error TS2322: Type 'null' is not assignable to type 'number'. x = null; Found 2 errors.
Também ocorrerá um erro se tentarmos atribuir o valor undefined
null
Ainda assim, existem situações em que não sabemos com certeza se uma variável, ou um parâmetro de função, contém um valor ou se ele está ausente. Isso é especialmente comum quando recebemos dados de uma fonte externa, como uma requisição a um recurso de rede. Nesses casos, pode ser necessário permitir que uma variável ou parâmetro aceite o valor null
let userId: number | null = null;
function printId(id: number | null) {
if (id === null) {
console.log("Usuário ausente");
} else {
console.log(`ID do usuário: ${id}`);
}
}
printId(userId); // Usuário ausente
userId = 45;
printId(userId); // ID do usuário: 45
Aqui, a variável userId
number
null
null
De maneira similar, a função printId
id
null
Operador !
O operador !
null
undefined
const header: HTMLElement | null = document.getElementById("header");
header.innerText = "Hello TypeScript!";
A função embutida document.getElementById()
HTMLElement
null
innerText
Embora o código pareça correto, com a opção strictNullChecks
app.ts:2:1 - error TS2531: Object is possibly 'null'. header.innerText = "Hello TypeScript!"; Found 1 error.
Para evitar o erro, usamos o operador !
const header: HTMLElement | null = document.getElementById("header");
header!.innerText = "Hello TypeScript!";
O operador !
null
object!.property
object!.method()
No entanto, é importante lembrar que este operador não altera o valor do objeto. Se o objeto for null ou undefined, o operador não irá impedir erros. O código será compilado, mas, durante a execução, o programa ainda lançará um erro.
Portanto, recomenda-se utilizar esse operador apenas quando tivermos certeza absoluta de que o objeto não é null
undefined