typescript - Değiştirilemez nesnelerden oluşan değiştirilemez bir diziyi nasıl temsil edebilirim?


Yapıcı parametrelerinden biri bir nesne dizisi olan bir sınıf tanımlamak istiyorum ve ne dizinin ne de içindeki nesnelerin değiştirilmeyeceği garantisini vermek istiyorum. Mevcut denemem readonly değiştiricisini ve Readonly<T> generiğini kullanıyor ve şöyle bir şey gibi görünüyor:

export type Foo = { foo: string };

export class Bar {
  readonly foo: Foo;
  readonly bars: Array<Readonly<Bar>>;

  constructor(
    foo: Readonly<Foo>,
    bars: Readonly<Array<Readonly<Bar>>>,
  ) {
    this.foo = foo;
    this.bars = bars;
  }
}

(Oyun alanı bağlantısı.)

Ancak, bu this.bars=bars; satırında bir hata veriyor ve Tip 'readonly Readonly<Bar>[]' 'readonly' ve değiştirilebilir tip 'Readonly<Bar>[]' olarak atanamaz.ts(4104) diyor.

Biraz araştırdıktan sonra, eğer onları doğru anladıysam, değiştirilebilir diziler ile readonly/Readonly<T> dizilerinin birbirine atanamayacağını gösteriyor gibi görünen birkaç cevap buldum.

Peki, o zaman ifade etmeye çalıştığım değiştirilemezlik sözleşmesini nasıl temsil edebilirim? Typescript 4.5.2 kullanıyorum ve tsconfig.json dosyam şu şekildedir:

{
  "compilerOptions": {
    "exactOptionalPropertyTypes": true,
    "forceConsistentCasingInFileNames": true,
    "isolatedModules": true,
    "noImplicitOverride": true,
    "noPropertyAccessFromIndexSignature": true,
    "noUncheckedIndexedAccess": true,
    "strict": true
  }
}

Cevap #1

Bir ReadonlyArray kullanırdım.

export type Foo = { foo: string };

export class Bar {
  readonly foo: Foo;
  readonly bars: ReadonlyArray<Readonly<Bar>>;

  constructor(
    foo: Readonly<Foo>,
    bars: ReadonlyArray<Readonly<Bar>>,
  ) {
    this.foo = foo;
    this.bars = bars;
  }
}

Açıklamada readonly bars: ReadonlyArray<Readonly<Bar>>, farklı parçaların anlamı şöyledir:

  • readonly, bars özelliğinin yalnızca okunabilir olduğunu belirtir, this.bars=ne olursa olsun yazmanızı engeller.
  • ReadonlyArray, dizinin salt okunur olduğunu belirtir, this.bars[0]=whatever yazmanızı engeller.
  • Readonly<Bar>, dizinin elemanlarının salt okunur olduğunu belirtir, this.bars[0].foo=whatever işlemini engeller.

İlgili makaleler