typescript - Hur man härleder tuppelns index 0 i en tvådimensionell array av tupler till literalt typ?


Jag har en arraytyp av tupler, hur gör man så att TypeScript härleder index 0 av tupler som en union?

Exempel :

type KV = [string, string];
type KVs = KV[];

function sample(param: KVs) {
  return param.map(([key]) => key);
}

// here result is: string[]
const result = sample([
  ["a", "b"],
  ["c", "d"],
]);

Hur kan jag göra så att resultattypen blir en array av "a" | "c"?

Svar #1

Du kan använda generics:

type KV<T extends string, U extends string> = [T, U];

function sample<T extends string, U extends string>(param: KV<T, U>[]) {
  return param.map(([key]) => key);
}

// result: ("a" | "c")[]
const result = sample([
  ["a", "b"],
  ["c", "d"],
]);

Detta typer KV som en tuppel med två generiska parametrar, båda som måste vara strängar, men som också kan vara en smalare typ som ett strängliteral. I detta fall kommer TypeScript att välja den smalaste typen för en given användning.

TS Lekplats