Strict mode, tsconfig.json içindeki "strict": true seçeneğidir. Örtük any'yi, kontrol edilmemiş null ve undefined'ı, güvensiz fonksiyon atamalarını ve başlatılmamış class alanlarını yakalayan sekiz tip kontrol bayrağı için tek bir anahtardır. TypeScript 7'de strict varsayılan olarak açıktır. Bu kontrollerden geçen kod şöyle görünür:
Çıktı no user, SyntaxError ve 42 olur. : number, ?. ya da instanceof kontrolünü kaldırın, dosya artık derlenmez.
Açmak
{
"compilerOptions": {
"strict": true
}
}
Tek tek bayraklar her iki yönde de strict'e üstün gelir. "strict": true, "strictNullChecks": false null kontrolü dışındaki her şeyi korur; "strict": false, "noImplicitAny": true yalnızca o bayrağı açar. strict sizi gelecek sürümlerde eklenen kontrollere de dahil eder, çünkü strict ailesine yeni bayraklar gruba katılır.
TypeScript'in strict seçeneğinin, bir çalışma zamanı modu olan JavaScript'in "use strict" yönergesiyle hiçbir ilgisi yoktur. TypeScript 7 gereken yerde her zaman "use strict" üretir ve alwaysStrict: false ayarı TS5108 hatasıdır (seçenek kaldırıldı).
Her Bayrak Neyi Yakalar
| Bayrak | Neyi bildirir | Hata |
|---|---|---|
noImplicitAny | tipi sessizce any olacak bir parametre ya da değişken | TS7006 Parameter 'x' implicitly has an 'any' type. |
strictNullChecks | null ya da undefined olabilecek bir değeri kullanmak | TS18048 'u' is possibly 'undefined'. |
strictFunctionTypes | parametre tipi gerekenden dar olan bir fonksiyonu atamak | TS2322 |
strictBindCallApply | .call, .bind ve .apply için yanlış argümanlar | TS2345 |
strictPropertyInitialization | hiç atanmayan bir class alanı | TS2564 Property 'name' has no initializer and is not definitely assigned in the constructor. |
noImplicitThis | iç içe bir function içinde olduğu gibi örtük any tipinde this | TS2683 |
useUnknownInCatchVariables | bir catch değişkenini daraltmadan kullanmak (o unknown'dır) | TS18046 'err' is of type 'unknown'. |
strictBuiltinIteratorReturn | yerleşik bir iterator'ın it.next().value değerini her zaman tanımlı saymak | TS2322 |
En çok kodu değiştiren ikisi noImplicitAny ve strictNullChecks'tir. Bu blok ikisini de bilerek bozar:
Şunları yazdırır: index.ts(2,17): error TS7006: Parameter 'x' implicitly has an 'any' type. ve index.ts(11,13): error TS18048: 'user' is possibly 'undefined'. Strict olmadan bu kod derlenir ve sonra çalışma zamanında TypeError: Cannot read properties of undefined (reading 'name') ile çöker. Strict ile çökme bir derleme hatasına dönüşür. Düzeltmeler bu sayfadaki ilk bloktadır.
strictFunctionTypes: Neden Var
Yalnızca string'leri işleyen bir fonksiyon, number gelebilecek bir yerde kullanılmamalıdır. Aşağıdaki kontrol @ts-expect-error ile susturuldu, böylece çalıştırıp hatanın neyi önlediğini görebilirsiniz:
Yorum olmadan atama TS2322 hatasıdır: Type '(s: string) => void' is not assignable to type 'Handler'. ve ardından Types of parameters 's' and 'value' are incompatible. Tasarım gereği bir istisna kalır: metot söz dizimiyle tanımlanan metotların parametreleri (bir interface içindeki handle(value: string | number): void) hâlâ daha gevşek şekilde kontrol edilir, bu yüzden shout böyle bir metoda hatasız atanabilirdi.
strictPropertyInitialization
Her class alanı, tanımında ya da constructor içinde bir değer almalıdır. Bunu karşılamanın üç yolu:
Çıktı:
Account {
owner: 'Ada',
balance: 0,
history: [],
lastLogin: undefined,
sessionId: 's-1'
}
lastLogin ve sessionId özellikleri undefined değeriyle vardır, çünkü ES2022 hedefinde class alanları gerçek JavaScript alanlarıdır. ! herhangi bir çalışma zamanı koruması eklemeden kontrolü kaldırır, bu yüzden diğer biçimleri tercih edin. Bu bayrak strictNullChecks gerektirir; onu kapatmak bunu da devre dışı bırakır.
Var Olan Bir Projede Strict'i Açmak
Büyük bir kod tabanını bir anda strict'e geçirmek yüzlerce hata üretebilir. strict TypeScript 7'nin varsayılanı olduğu için, tsconfig.json dosyası strict'ten hiç söz etmeyen bir projeyi yükseltmek onu kendiliğinden açar; taşıma sürerken eski davranışa ihtiyacınız varsa "strict": false yazın. Build'i yeşil tutan bir yol:
"strict": trueekleyin ve en çok hata veren bayrakları kapatın, genellikle"strictNullChecks": falseve"noImplicitAny": false.- Kalan hataları düzeltin, sonra bir bayrak daha açın ve tekrarlayın.
noImplicitAnyiçin düzeltmelerin çoğu parametre işaretlemeleridir.strictNullChecksiçin değerlerin eksik olabileceği yerlere| undefinedekleyin, sonra bunu?.,??ya da birifkontrolüyle ele alın.- Bir düzeltmenin beklemesi gerekiyorsa satıra gerekçesiyle birlikte
// @ts-expect-errorkoyun.@ts-ignore'dan farklı olarak sorun ortadan kalktığında bir hata bildirir, böylece liste kendiliğinden küçülür.
Hataları toplu halde susturmak için as any ya da ! kullanmayın: her biri, bayrağın bulmak için eklendiği hatayı tam olarak gizler.
Strict'in İçermediği Faydalı Bayraklar
Bunlar ayrıdır, çünkü çoğu zaman doğru olan kodu reddederler. Yine de birçok proje onları açar.
| Bayrak | Ne yapar |
|---|---|
noUncheckedIndexedAccess | arr[i] ve record[key] tiplerine undefined eklenir |
exactOptionalPropertyTypes | debug?: boolean eksik bir anahtarı kabul eder ama debug: undefined değerini kabul etmez |
noImplicitReturns | değer döndüren bir fonksiyonun her kod yolu bir değer döndürmelidir (TS7030) |
noImplicitOverride | bir temel metodu ezen metot override yazmalıdır (TS4114) |
noFallthroughCasesInSwitch | boş olmayan bir case, break, return ya da throw ile bitmelidir (TS7029) |
noUnusedLocals, noUnusedParameters | kullanılmayan değişkenler ve parametreler hatadır |
noPropertyAccessFromIndexSignature | index signature'dan gelen anahtarlar obj.key değil obj["key"] ile kullanılmalıdır |
En çok gerçek hatayı noUncheckedIndexedAccess yakalar. Açıkken:
const scores = [90, 85];
const d: Record<string, number> = {};
const third: number = scores[2]; // error TS2322: Type 'number | undefined' is not assignable to type 'number'.
const c: number = d["x"]; // same error
const safe = scores[2] ?? 0; // number
for (const s of scores) { // for...of is not affected: s is number
console.log(s);
}
TypeScript 7'deki tsc --init, ürettiği config'te strict'in yanında noUncheckedIndexedAccess ve exactOptionalPropertyTypes bayraklarını da açar.
Sıkça Sorulan Sorular
TypeScript'te strict mode ne işe yarar?
"strict": true bir grup daha sıkı kontrolü açar: noImplicitAny, strictNullChecks, strictFunctionTypes, strictBindCallApply, strictPropertyInitialization, noImplicitThis, useUnknownInCatchVariables ve strictBuiltinIteratorReturn. Birlikte any'nin sessizce ortaya çıkmasını engeller ve null ile undefined'ı tip sisteminin bir parçası yaparlar.
TypeScript'te strict mode varsayılan olarak açık mı?
TypeScript 7'de evet: strict varsayılan olarak true'dur, bu yüzden strict ayarı olmayan bir proje her strict kontrolü alır. tsc --init de "strict": true değerini açıkça yazar. Kapatmak için "strict": false yazmanız gerekir.
Bir strict kontrolünü kapatıp geri kalanını koruyabilir miyim?
Evet. Tek tek bayraklar strict'i geçersiz kılar: { "strict": true, "strictNullChecks": false } null kontrolü dışında her strict kontrolü korur. Büyük bir kod tabanını bayrak bayrak taşımanın olağan yolu budur.
TypeScript strict mode, JavaScript'teki "use strict" ile aynı mı?
Hayır. "use strict", kodun davranışını değiştiren bir JavaScript çalışma zamanı modudur. TypeScript'in strict seçeneği ise yalnızca tip denetleyicisinin neyi bildirdiğini değiştirir. TypeScript 7 modül olmayan çıktı için her zaman "use strict" üretir ve alwaysStrict: false artık kaldırılmış bir seçenektir.
strict, noUncheckedIndexedAccess'i içerir mi?
Hayır. noUncheckedIndexedAccess, exactOptionalPropertyTypes, noImplicitReturns, noImplicitOverride ve noFallthroughCasesInSwitch sizin açtığınız ayrı bayraklardır. tsc --init ürettiği config'te ilk ikisini açar.