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 & stringspune 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).