Maszynopis: void typ powrót przekształca się w każdego rodzaju?

głosy
17

I wydaje się nie być w stanie zrozumieć, dlaczego następujący kod nie podnieść błąd:

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

I wyraźnie stwierdzają, że typ powinien być tablicą funkcji, które zwracają voidjednak wciskam tam funkcję zwracającą stringi jeszcze kompilator nie narzekać. Jeśli zmienić definicję rgdo

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

Kompilator zaczyna narzekać.

Jest to błąd, czy jest to w jaki typ void powrotny ma pracować (czyli jeśli coś pójdzie nie voidjest używany, w zasadzie dzięki czemu jest taki sam jak typ zwracany any)?

Utwórz 06/10/2012 o 17:34
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
17

Jest to zgodne z projektem (Wytłumaczę dlaczego to jest dobry projekt wkrótce). Spec mówi (w sekcji 3.6.3, skrócone dla jasności):

Typ S jest przypisane do typu T i T jest przypisane z S, jeśli jedno z poniższych stwierdzeń jest prawdziwe ...

  • S i T są typy obiektów, a dla każdego z M użytkownik w T, jedna z poniższych sytuacji:

    • M jest połączenie konstrukt lub sygnatura indeksu i S zawiera wywołanie konstrukt lub sygnatura indeksu N w którym

      • typ wyniku M jest nieważne lub typ wyniku N jest przypisane do M.

W tym przypadku, testujemy jeśli () => stringjest przypisane do () => void. Więc albo stringmusi być przypisane do void(nie jest), czy voidma być void(jest).


W efekcie, zasada jest tu masz prawo wyrzucić wartości zwracanej , co jest zgodne ze sposobem np C ++ traktuje voidw rozdzielczości matrycy.

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?

Kiedy ograniczyć typ changesię (widget) => void, robimy to tak, że można przekazać decrementWidgetHeightjako drugi argument, mimo że ma wartość powrotną, ale nadal upewniając się, że gdy piszemy ciało applyToManyWidgets, nie przypadkowo użyć wartość powrócić changew dowolnym miejscu.

Należy pamiętać, że voidjest jeszcze inny niż anybo to niedozwolonych:

function f() { }
var x = f(); // Disallowed, f() is of type 'void'
Odpowiedział 06/10/2012 o 22:06
źródło użytkownik

głosy
0

To wygląda jak robaka. Należy otworzyć nowy element roboczy do wydania

Odpowiedział 06/10/2012 o 18:38
źródło użytkownik

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