JSON.parse any döndürür, bu yüzden TypeScript sonucu atadığınız her tipi kabul eder. Bu, parse edilen JSON'u tiplemeyi tek satırlık bir iş yapar, ama aynı zamanda tipin derleyicinin kontrol ettiği bir şey değil, sizin verdiğiniz bir söz olduğu anlamına gelir:
İkinci nesnede age, "41" string'idir. TypeScript onu yine de number olarak görür, çünkü any her şeye atanabilir ve program 411 yazdırır. Kendi kodunuzun az önce yazdığı JSON için işaretleme yeterlidir. Bir istekten, bir dosyadan ya da local storage'dan gelen veriyi doğrulayın.
unknown'a Parse Etmek
Sonucu unknown olarak tiplemek, derleyicinin herhangi bir özellik kullanılmadan önce bir kontrol istemesini sağlar:
Hata şudur: index.ts(4,13): error TS18046: 'data' is of type 'unknown'. Sonra yazdığınız her kontrol data'yı biraz daha daraltır.
Type Guard ile Doğrulamak
Type guard, value is User döndüren bir fonksiyondur. true döndürdüğünde TypeScript değeri o andan itibaren bir User olarak görür ve içindeki kontroller gerçek çalışma zamanı kontrolleridir:
JSON.parse bozuk metinde kendisi bir SyntaxError fırlatır, bu yüzden gerçek kod onu da try/catch ile sarar. Büyük ya da iç içe veri için elle yazılan guard'lar uzar; Zod ya da Valibot gibi şema kütüphaneleri şekli bir kez tanımlamanıza ve hem doğrulayıcıyı hem de TypeScript tipini ondan türetmenize izin verir.
JSON'dan TypeScript Interface'ine
Bir JSON örneğini tiplere çevirmek mekanik bir iştir. Şu yanıt verildiğinde:
{
"id": 42,
"title": "Learn TypeScript",
"done": false,
"owner": { "id": 7, "name": "Ada" },
"tags": ["study", "ts"],
"dueDate": "2024-03-15T10:30:00Z",
"notes": null
}
Her değeri tipine eşleyin, iç içe nesnelere kendi interface'lerini verin ve değişebilen yerleri işaretleyin:
Tek bir örnek hangi alanların isteğe bağlı ya da null olabileceğini söyleyemez. ? ve | null kararını vermeden önce birkaç yanıta ya da API'nin belgelerine bakın.
Tarihler ve Reviver
JSON'un bir tarih tipi yoktur, bu yüzden tarihler string olarak gelir. JSON.parse'ın ikinci argümanı olan reviver her anahtar için çağrılır ve onları yeniden oluşturabilir:
Reviver'ın value parametresi any'dir, sonuç da öyle; bu yüzden Order tipi hâlâ kontrol edilmez, güvenilir. JSON.stringify(order, null, 2) çıktıyı iki boşlukla girintiler ve Date'i yeniden ISO string'ine çevirir.
JSON.stringify ve Kaybettikleri
JSON.stringify, string döndürecek şekilde tiplenmiştir. Dönüştürdüğü değerler her zaman aynı şekilde geri gelmez ve tip sizi uyarmaz:
| Değer | JSON.stringify sonrası |
|---|---|
Date | ISO string (toJSON metodu aracılığıyla) |
Map, Set | {} (önce [...set] ya da Object.fromEntries(map) ile dönüştürün) |
Bir nesnedeki undefined, fonksiyonlar, symbol'ler | anahtar dışarıda bırakılır |
Bir dizideki undefined, fonksiyonlar, symbol'ler | null |
Tek başına undefined, bir fonksiyon ya da bir symbol | string değil, undefined |
NaN, Infinity | null |
bigint | bir TypeError fırlatır |
Çalışma zamanı kuralları düz JavaScript'tekiyle aynıdır ve JavaScript'te JSON sayfasında anlatılır.
Her JSON Değeri İçin Bir Tip
Kod rastgele JSON işlediğinde, özyinelemeli bir tip JSON'un tam olarak neleri tutabileceğini tanımlar ve tutamayacağı değerleri reddeder:
Yorum olmadan son satır bir derleme hatasıdır, çünkü bir Date nesnesi bir JsonValue değildir.
.json Dosyalarını Import Etmek
Bir .json dosyası bir modül gibi import edilebilir ve TypeScript tipini içeriğinden çıkarır:
{ "name": "app", "port": 8080, "tags": ["a"] }
// CommonJS output, or a bundler
import config from "./config.json";
const port: number = config.port; // typed from the file: number
// An ES module under module: nodenext
import settings from "./config.json" with { type: "json" };
TypeScript 7'de bu, module değeri nodenext, node20, commonjs, esnext ya da preserve iken ek ayar olmadan çalışır. node16 ve node18 altında siz "resolveJsonModule": true ekleyene kadar TS2732 hatasıyla başarısız olur: Cannot find module './config.json'. Consider using '--resolveJsonModule' to import module with '.json' extension. Seçeneği false yapmak JSON import'larını her yerde kapatır. nodenext ya da node20 altındaki bir ES modülünde import with { type: "json" } attribute'unu gerektirir (onsuz TS1543 hatası) ve yalnızca default import'a izin verilir (import { port } için TS1544 hatası). tsc, import edilen .json dosyasını derlenmiş JavaScript'in yanına, outDir içine kopyalar.
Sıkça Sorulan Sorular
TypeScript'te JSON.parse hangi tipi döndürür?
any. Derleyici bir string'in ne içerdiğini bilemez, bu yüzden const user: User = JSON.parse(text) metin ne içerirse içersin derlenir. Veri programınızın dışından geliyorsa sonucu unknown'a atayın ve doğrulayın.
JSON'u bir TypeScript interface'ine nasıl çeviririm?
Temsil edici bir örnek alın ve her anahtar için bir özellik yazın: string, number ve boolean değerleri string, number ve boolean olur, iç içe bir nesne kendi interface'i olur, nesnelerden oluşan bir dizi Item[] olur ve bazen eksik olan anahtarlar ? alır. quicktype gibi kod üreticiler bunu otomatikleştirir, ancak tahminlerini birden fazla örnekle kontrol edin.
TypeScript'te bir JSON dosyasını nasıl import ederim?
import config from "./config.json";, TypeScript 7'de module değeri nodenext, node20, commonjs, esnext ya da preserve iken çalışır ve sonuç dosyanın içeriğine göre tiplenir. node16 ya da node18 ile ayrıca "resolveJsonModule": true ayarlayın. nodenext ya da node20 altındaki bir ES modülünde Node'un istediği attribute'u ekleyin: import config from "./config.json" with { type: "json" };.
JSON.stringify her zaman string mi döndürür?
Tipi string der, ancak JSON.stringify(undefined) ve JSON.stringify(() => 1) çalışma zamanında undefined döndürür. Nesnelerin içindeki değerler de dönüştürülür: bir Date ISO string'ine dönüşür, Map ve Set ise {} olur.