Typescript null-kedja och typereduktion


Jag har stött på ett fall där jag känner att TypeScript inte korrekt begränsar en given typ.

(value: number[] | null) => {
  if ((value?.length ?? 0) > 0) value[0];
};

I if-grenen ger det mig fortfarande ett Object is possibly 'null' även om villkoret inte kommer att vara sant om value är null.

Borde inte detta smalnas av och varför ja/nej?

Finns det en bekväm lösning om detta förväntade beteende?

Svar #1

Inte det fullständiga svaret men:

Detta hände eftersom du inte har en direkt kontroll för null/undefined och TS är ännu inte så smart att identifiera detta själv.

Du har två alternativ:

1. Mer utförlig men säkrare:

Använd kryss som här:

(value: number[] | null) => {
    if (value ==null && value.length > 0) value[0];
};

eller med typvakter som här:

(value: number[] | null) => {
    if (!isnull(value) && value.length > 0) value[0];
};

function isnull(value: any): value is null {
    return value == null;
}

2. Alternativ för de säkra människorna:

Säg till TS att: Jag är säker gör bara det och använd !-notation. Som här:

(value: number[] | null) => {
  if (value?.length ?? 0 > 0) value![0];
};

Hoppas detta hjälper