Menu

TypeScript JSON: JSON.parse Tipleme, JSON'dan Interface

JSON.parse any döndürür, bu yüzden TypeScript sonuca verdiğiniz her tipe güvenir. Parse edilen JSON'u tiplemeyi, bir type guard ile doğrulamayı, bir JSON örneğini interface'e çevirmeyi, .json dosyalarını import etmeyi ve JSON.stringify'ın Date, Set ve undefined değerlerine ne yaptığını öğrenin.

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

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ğerJSON.stringify sonrası
DateISO 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'leranahtar dışarıda bırakılır
Bir dizideki undefined, fonksiyonlar, symbol'lernull
Tek başına undefined, bir fonksiyon ya da bir symbolstring değil, undefined
NaN, Infinitynull
bigintbir 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.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA