Typescript: Herhangi türüne dönüştürülür void dönüş tipi?

oy
17

Aşağıdaki kod hatası yükseltmek değil neden anlamak mümkün değildir görünmektedir:

var rg: {(): void;}[] = [];
rg.push(function():string {return ;})

Açıkça tipi döndüren işlevler dizisi olması gerektiğini ifade voidancak ben döndüren bir işlev orada itin stringve henüz derleyici şikayet etmiyor. Ben tanımını değiştirirseniz rgiçin

var rg: {():number;}[] = [];

derleyici şikayet etmeye başlar.

Bu bir hata mı yoksa boşluk dönüş tipi çalışması gerekiyordu nasıl olduğunu (yani eğer bir şey gider voidtemelde o dönüş türü ile aynı hale kullanılır any)?

Oluştur 06/10/2012 saat 17:34
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
17

Bu tasarım gereğidir (bu iyi tasarım kısa bir süre olduğunu açıkladığım gerekir). Spec (netlik için kısaltılmış, bölüm 3.6.3 olarak) diyor ki:

A tipi S T türü için atanabilir ve aşağıdakilerden biri doğruysa, T, S atanabilir olduğunu ...

  • S, T, T, her üyesi M, aşağıdakilerden biri geçerlidir, nesne türleri ve:

    • M, S, bir çağrı içerir oluşturmak veya dizin imzası ve bir çağrı kurmak veya dizin imzası nerede

      • M sonucu türü geçersizdir ya da N sonucu türü M. edilene tayin edilebilir

Bu durumda, biz test ediyoruz () => stringatanabilir olduğunu () => void. Yani ya stringatanabilir olmak zorundadır void(değil), ya da voidolmak zorunda void(öyle).


Gerçekte, burada kural olduğunu size dönüş değeri atmak için izin verilir nasıl mesela C ++ davranır ile tutarlıdır, voidşablon çözünürlükte.

function decrementWidgetHeight(w: Widget): number {
    // ... returns the new height of the widget
}

function applyToManyWidgets(w: Widget[], change: (x: Widget) => void): void {
    // for each widget in the array, apply 'change' to it
}

// Later...
applyToManyWidgets(widgetsToShorten, decrementWidgetHeight); // Should be allowed?

Biz türünü sınırlamak zaman changeolduğu (widget) => void, sizi geçirebilmesi için bunu yapıyoruz decrementWidgetHeightbir dönüş değeri vardır rağmen ikinci argüman olarak, ama yine de biz gövdesini yazarken emin applyToManyWidgets, biz yanlışlıkla kullanmayın değerini döndürür changeher yerde.

Not voidhala farklıdır anybu unallowed çünkü:

function f() { }
var x = f(); // Disallowed, f() is of type 'void'
Cevap 06/10/2012 saat 22:06
kaynak kullanıcı

oy
0

Bu bir böcek gibi görünüyor. Bir açmalı yeni iş öğesi sorunu için

Cevap 06/10/2012 saat 18:38
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more