javascript - Endast udda nummer typ för Typescript
Jag vill ha en typ som kontrollerar om värdet är ett udda tal eller inte. Jag försökte hitta något men jag hittar bara hårdkodade lösningar som odds: 1 | 3 | 5 | 7 | 9. Men jag vill veta om det finns ett dynamiskt sätt att göra det bara med Typescript.
Jag vet att man till exempel i JS kan ta reda på om ett tal är udda eller inte med detta uttryck x % 2 === 1. Jag vill veta om det finns ett sätt att definiera en typ med ett uttryck som detta.
Svar #1
Ja, det är möjligt
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 vissa begränsningar, inmatningen måste vara ett udda tal och får inte överstiga 1999 (maximal djup för typescript-rekursion är endast 1000)
lekplats
Svar #2
Kanske kan det vara hjälpsamt att skapa en ny klass i det här fallet?
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);
