TypeScript: Jak stworzyć pustą liczbę?

Opublikowano: 10.01.2023 - tagi: TypeScript JavaScript Liczba

Czym jest pusta liczba?

Ostatnio stanąłem przed zadaniem napisania testu jednostkowego, który sprawdzał przypadek: przekazany do funkcji model danych jest niepoprawny, więc walidacja powinna to wykryć i nie stworzyć rekordu w bazie danych. Jedno z wymaganych pól jest liczbą. Na przykład:

interface Model {
    name: string;
    value: number;
};

test('should not allow empty number', () => {
    // given
    const model: Model = {
        name: 'Test',
    };

    // when
    const result: boolean = validate(model);

    // given
    expect(result).toBeFalsy();
});

W tym teście symuluję przypadek, gdy do modelu nie jest przekazana wartość dla pola value. Problem w tym, że taki zapis nie zadziała, ponieważ TypeScript wyrzuci błąd:

error TS2741: Property 'value' is missing in type '{ name: string; }' but required in type 'Model'

Ten problem można rozwiązać poprzez małą zmianę w definicji modelu:

interface Model {
    name: string;
    value?: number;
};

Za pomocą operatora: ? informujemy TypeScript, że pole value jest opcjonalne, ale... to nie prawda, bo powinno być wymagane!

Jak to rozwiązać?

Pusta liczba przykład

Żeby stworzyć "pustą" liczbę można jej przypisać wartość NaN:

interface Model {
    name: string;
    value: number;
};

test('should not allow empty number', () => {
    // given
    const model: Model = {
        name: 'Test',
        value: NaN
    };

    // when
    const result: boolean = validate(model);

    // given
    expect(result).toBeFalsy();
});

Wartość NaN jest typu number i dlatego TypeScript nie sygnalizuje błędu.