javascript - Bare oddetalltype for Typescript


Jeg vil ha en type som sjekker om verdien er et odde tall eller ikke. Jeg prøvde å finne noe, men jeg finner bare hardkodede løsninger som odds: 1 | 3 | 5 | 7 | 9. Men jeg vil vite om det finnes en dynamisk måte å gjøre det på bare med Typescript.

Jeg vet at for eksempel i JS kan vi finne ut om tallet er oddetall eller ikke med dette uttrykket x % 2 === 1. Jeg vil vite om det finnes en måte å definere en type med et uttrykk som dette.

Svar #1

Ja, det er mulig

type OddNumber<
    X extends number,
    Y extends unknown[] = [1],
    Z extends number = never
> = Y['length'] extends X
    ? Z | Y['length']
    : OddNumber<X, [1, 1, ...Y], Z | Y['length']>

type a = OddNumber<1> // 1 
type b = OddNumber<3> // 1 | 3
type c = OddNumber<5> // 1 | 3 | 5
type d = OddNumber<7> // 1 | 3 | 5 | 7

med noen begrensninger, inngangen må være et oddetall og kan ikke overstige 1999 (maksimal dybde for TypeScript-rekursjon er kun 1000)

lekeplass

Svar #2

Kanskje det kan være hjelpsomt å opprette en ny klasse i dette tilfellet?

class OddNumber {
    value: number;

    constructor(value: number) {
        if (value % 2 != 0)
            throw new Error("Even number is not assignable to type 'OddNumber'.");
        this.value = value;
    }
};

let oddNumber = new OddNumber(4);
console.log(oddNumber.value); // It will log 4
let evenNumber = new OddNumber(5); // It will throw an exception here
console.log(evenNumber.value);

Relaterte artikler