javascript - Tür bildirimi nesne sözdizimi için çalışıyor, ancak sınıf uygulaması için çalışmıyor


Bir koordinatı temsil edecek bir tür istiyorum. Bir arayüze uyguladığım tür, bir nesne için çalışıyor ama bir sınıf için çalışmıyor.

type ICoord = [number, number]

type MyInterface = {
    a: ICoord
}

var obj: MyInterface = { // works
    a: [0, 0]
}

class C implements MyInterface { // gets below compilation error
    a = [0, 0]
}

'C' türündeki 'a' özelliği, temel tür 'MyInterface'teki aynı özelliğe atanamaz. 'number[]' türü, '[number, number]' türünden şu özellikleri eksik: 0, 1

a'ya [0, 0] neden atayamıyorum?

[TypeScript Oynatma Alanı]

Cevap #1

a değişkeninin türü number[] olarak çıkarımı yapılıyor ve bu, [number, number] tuple'ına atanamaz. a için türü açıkça ICoord olarak tanımlamak işe yarıyor gibi görünüyor:

type ICoord = [number, number];

type MyInterface = {
  a: ICoord;
}

class C implements MyInterface {
  a: ICoord = [0, 0];
}

TypeScript Oyun Alanı

Cevap #2

Bu, bağlamsal yazımla ilgili.

Typescript, bir ifadenin beklenen türünü (MyInterface bu durumda) kullanarak nesne literalleri hakkında (aynı zamanda fonksiyon parametreleri hakkında) daha iyi çıkarımlar yapar. Bu yüzden bir nesne literalini atamak iyi çalışır ve dizi literalleri bir tuple türü olarak yazılır.

Sınıflar için durum biraz farklıdır. implements bölümü, sınıfın arayüzü doğru bir şekilde uygulayıp uygulamadığını, sınıf bağımsız olarak yazıldıktan sonra kontrol etmek için kullanılır. implements anahtar kelimesi, sınıf üyelerinin hiçbiri için bağlamsal tip oluşturmamaktadır. Bu aynı zamanda, işlev parametre türlerini, bunlar arayüzden veya temel sınıftan açıkça belli olsa bile, belirtmek zorunda olmanızın nedenidir.

İlgili makaleler