keyofStringsOnly în TypeScript

tsconfig: opțiuni scoase (compatibilitate) TypeScript 2.9 (scoasă în 5.5)

Opțiune scoasă care făcea keyof să dea doar chei string; azi se scrie keyof T & string.

Sintaxă
// scoasă; în locul ei:
type Chei = keyof T & string;
type Chei2 = Extract<keyof T, string>;

Ce face keyofStringsOnly

Opțiunea face parte din „Backwards Compatibility”: a fost marcată ca depreciată în TypeScript 5.0 și scoasă în TypeScript 5.5. În tsc 5.9, prezența ei în tsconfig.json dă eroarea TS5102, iar "ignoreDeprecations": "5.0" nu mai ajută. Șterge-o din configurație.

Din TypeScript 2.9, keyof T poate conține chei string, number și symbol, pentru că toate trei pot fi chei de obiect în JavaScript. Codul mai vechi presupunea că keyof dă doar texte; keyofStringsOnly păstra comportamentul vechi, pentru tot proiectul.

Astăzi scrii explicit ce vrei, doar acolo unde ai nevoie: keyof T & string sau Extract<keyof T, string>.

Parametri

Parametru Descriere
keyofStringsOnly Scoasă. Dă TS5102 (și cu ignoreDeprecations).

Exemple

Exemplul 1: keyof cu toate tipurile de chei

Obiectul are o cheie text, una numerică și una symbol. keyof le cuprinde pe toate trei, deci nu se potrivește cu string. Opțiunea veche nu mai poate fi pornită nici cu ignoreDeprecations.

// tsconfig.json (pentru a doua comandă)
{
  "compilerOptions": {
    "target": "es2022",
    "ignoreDeprecations": "5.0",
    "keyofStringsOnly": true
  }
}

// index.ts (prima comandă: "strict": true, fără opțiunile de mai sus)
const stoc = { mere: 12, 7: "raft", [Symbol.iterator]: null };
type Chei = keyof typeof stoc;
const c: string = "" as Chei;
console.log(c);

Rezultat (tsc 5.9)

$ npx tsc
index.ts(3,7): error TS2322: Type 'string | number | typeof Symbol.iterator' is not assignable to type 'string'.
  Type 'typeof Symbol.iterator' is not assignable to type 'string'.

$ npx tsc          # cu "ignoreDeprecations": "5.0" și "keyofStringsOnly": true
tsconfig.json(5,5): error TS5102: Option 'keyofStringsOnly' has been removed. Please remove it from your configuration.

Exemplul 2: Doar cheile text

keyof T & string păstrează doar cheile de tip text, deci funcția poate folosi metode de string.

function cheiMari<T extends object>(obiect: T): string[] {
  const chei = Object.keys(obiect) as (keyof T & string)[];
  return chei.map(cheie => cheie.toUpperCase());
}

const elev = { nume: "Ana", oras: "Iași", nota: 10 };
console.log(cheiMari(elev));

Rezultat

[ 'NUME', 'ORAS', 'NOTA' ]

Greșeli frecvente

  • Să scrii String(cheie) peste tot în loc să restrângi tipul. keyof T & string spune clar ce chei aștepți.

Comenzi înrudite

  • noImplicitAny: Dă eroare când TypeScript nu poate deduce un tip și ar folosi în tăcere any (de obicei la parametrii fără tip).
  • strict: Pornește dintr-o singură mișcare toate verificările stricte de tipuri (strictNullChecks, noImplicitAny și celelalte).