typescript - Använd villkorlig typ som returtyp fungerar inte korrekt


Jag vill få en sträng baserad på typen av inmatningsparametern till en funktion toTypeString enligt följande:

function toTypeString<T extends string | number>(x: T): T extends string ? "S" : T extends number ? "N": never {
  if (typeof x === 'string') return 'S';
  if (typeof x === 'number') return 'N';
  throw new Error(`unexpected value: ${x}`);
}

Det fungerar, men kompilerar inte med följande fel:

Type '"S"' is not assignable to type 'T extends string ? "S" : T extends number ? "N" : never'.
Type '"N"' is not assignable to type 'T extends string ? "S" : T extends number ? "N" : never'.

(lekplats)

Hur kan jag åtgärda detta fel?

Svar #1

Jag skulle använda funktionsöverlagring här:

function toTypeString<T extends string | number>(x: T): T extends string ? "S" : T extends number ? "N": never
function toTypeString(x: string | number): "S" | "N" {
  if (typeof x === 'string') return 'S';
  if (typeof x === 'number') return 'N';
  throw new Error(`unexpected value: ${x}`);
}

Lekplats

Relaterade artiklar