2016-01-15 27 views
5
bu 2 typescript kodu arasındaki fark nedir? (Ben typescript 1.7.5 kullanmak)

Bu 2 yazı tipi kodu arasındaki fark nedir?

interface SquareConfig { 
    color?: string; 
    width?: number; 
} 

function createSquare(config: SquareConfig): {color: string; area: number} { 
    var newSquare = {color: "white", area: 100}; 
    if (config.color) { 
    newSquare.color = config.color; 
    } 
    if (config.width) { 
    newSquare.area = config.width * config.width; 
    } 
    return newSquare; 
} 

var obj = {color1: "black"}; 
var mySquare = createSquare(obj); 

ancak kod üretim hatası altına hata değil derlemek olduğunu ne

. Hata

interface SquareConfig { 
    color?: string; 
    width?: number; 
} 

function createSquare(config: SquareConfig): {color: string; area: number} { 
    var newSquare = {color: "white", area: 100}; 
    if (config.color) { 
    newSquare.color = config.color; 
    } 
    if (config.width) { 
    newSquare.area = config.width * config.width; 
    } 
    return newSquare; 
} 

var mySquare = createSquare({color1: "black"}); 

: En örneklerinden

test.ts(18,30): error TS2345: Argument of type '{ color1: string; }' is not assignable to parameter of type 'SquareConfig'. Object literal may only specify known properties, and 'color1' does not exist in type 'SquareConfig'.

+0

color1 'rengine' rengini '? –

cevap

1

İkisi sık sık aklınıza mis demektir SquareConfig bilinmemektedir bir özelliği, belirtilen olmasıdır ki, aynı (algılanan) hata var bir özellik adı. Sizin durumunuzda, color'u kullanmayı düşündüğünüz color1 numaralı telefonu belirtmişsinizdir.

Bu kod, belirtilmemiş özelliklerin denetlenmesinin ek özelliği eklenmeden önce, daha eski TypeScript sürümleri kullanılarak derlenmişti.

Düzeltmeler ...

Opsiyon Bir, doğru özelliğini belirtin:, kasten başka özelliği dahil niyetinde

var mySquare = createSquare({color: "black"}); 

Seçenek İki, bildiğiniz derleyici anlatmak için bir tür belirtilme kullanmak öyle daha iyi (sürece sen öyle daha iyi biliyorum aslında yapmak emin olarak!):

var mySquare = createSquare(<SquareConfig>{color1: "black"}); 

Güncelleme comment

dayalı

derleyici var az "ayrılık derece" ... örneğin daha katıdır:

// Error 
var obj: SquareConfig = {color1: "black"}; 

// OK 
var obj = {color1: "black"}; 
var obj2: SquareConfig = obj; 

ilk örneğe bakalım, biz "diye bir SquareConfig oluşturmak niyetinde" diyorsun. Derleyici, "her şey isteğe bağlı olduğundan öğeye gerek yok, ancak nesneyi tanıyamadığım bir özellik ile yaratıyorsunuz - bu yüzden sizi uyarıyorum" diyor.

İkinci örnek biraz farklıdır. "SquareConfig olarak sahip olduğum bir nesneyi kullanmayı düşünüyorum" diyoruz. Derleyici, "gerekli tüm özellikleri kaçırmayı amaçladığınız nesne ... ve her bir mülkün bir SquareConfig için yapısal bir eşleşme olması için doğru tipte olduğunu söylüyor - evet."

İkinci senaryo, sizi hedef yapıda olmayan özellikler hakkında uyardıysa, yapısal tip bir sistemin sunduğu uber-polimorfizminden yararlanamazsınız.

+0

1 kodu değiştiğinde lütfen inceleyin. tanklar –

İlgili konular