Menu

TypeScript Strict Mode: strict: true Neleri Açar

tsconfig.json içindeki strict: true bir grup tip kontrolünü açar: noImplicitAny, strictNullChecks, strictPropertyInitialization ve beş tane daha. Her birinin neyi yakaladığını, var olan bir projede strict mode'u nasıl açacağınızı ve strict'in içermediği faydalı bayrakları görün.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

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

BayrakNeyi bildirirHata
noImplicitAnytipi sessizce any olacak bir parametre ya da değişkenTS7006 Parameter 'x' implicitly has an 'any' type.
strictNullChecksnull ya da undefined olabilecek bir değeri kullanmakTS18048 'u' is possibly 'undefined'.
strictFunctionTypesparametre tipi gerekenden dar olan bir fonksiyonu atamakTS2322
strictBindCallApply.call, .bind ve .apply için yanlış argümanlarTS2345
strictPropertyInitializationhiç atanmayan bir class alanıTS2564 Property 'name' has no initializer and is not definitely assigned in the constructor.
noImplicitThisiç içe bir function içinde olduğu gibi örtük any tipinde thisTS2683
useUnknownInCatchVariablesbir catch değişkenini daraltmadan kullanmak (o unknown'dır)TS18046 'err' is of type 'unknown'.
strictBuiltinIteratorReturnyerleşik bir iterator'ın it.next().value değerini her zaman tanımlı saymakTS2322

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:

  1. "strict": true ekleyin ve en çok hata veren bayrakları kapatın, genellikle "strictNullChecks": false ve "noImplicitAny": false.
  2. Kalan hataları düzeltin, sonra bir bayrak daha açın ve tekrarlayın.
  3. noImplicitAny için düzeltmelerin çoğu parametre işaretlemeleridir. strictNullChecks için değerlerin eksik olabileceği yerlere | undefined ekleyin, sonra bunu ?., ?? ya da bir if kontrolüyle ele alın.
  4. Bir düzeltmenin beklemesi gerekiyorsa satıra gerekçesiyle birlikte // @ts-expect-error koyun. @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.

BayrakNe yapar
noUncheckedIndexedAccessarr[i] ve record[key] tiplerine undefined eklenir
exactOptionalPropertyTypesdebug?: boolean eksik bir anahtarı kabul eder ama debug: undefined değerini kabul etmez
noImplicitReturnsdeğer döndüren bir fonksiyonun her kod yolu bir değer döndürmelidir (TS7030)
noImplicitOverridebir temel metodu ezen metot override yazmalıdır (TS4114)
noFallthroughCasesInSwitchboş olmayan bir case, break, return ya da throw ile bitmelidir (TS7029)
noUnusedLocals, noUnusedParameterskullanılmayan değişkenler ve parametreler hatadır
noPropertyAccessFromIndexSignatureindex 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.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA