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);
