Машинопись: аннулируются тип возвращаемого значения преобразуются к любому типу?

голоса
17

Я, кажется, не в состоянии понять, почему следующий код не вызывает ошибку:

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

Я четко указать , что тип должен быть массивом функций , которые возвращают void, однако я нажимаю там функцию , которая возвращает stringи пока компилятор не жаловаться. Если изменить определение rgдля

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

Компилятор начинает жаловаться.

Является ли это ошибка или это , как предполагается, работает тип возврата недействительным (то есть что - то пойдет , если voidиспользуется, в основном делает его таким же , как тип возвращаемого значения any)?

Задан 06/10/2012 в 17:34
источник пользователем
На других языках...                            


2 ответов

голоса
17

Это дизайн (я объясню, почему это хороший дизайн в ближайшее время). Спецификация говорит (в разделе 3.6.3, сокращенная для ясности):

Тип S отнесено к типу Т, а Т назначаемый из S, если одно из следующих условий ...

  • S и Т типы объектов и для каждого члена М в Т, одно из следующих условий:

    • М представляет собой вызов, построить или индекс подписи и S содержит вызов, построить или индекс подписи N, где

      • тип результата М Пустоты, или тип результата N отнесен к тому, что М.

В этом случае, мы тестируем , если () => stringэто присваиваемое () => void. Так как stringдолжно быть отнесено к void(это не так ), или voidдолжен быть void(это).


В действительности, правило здесь вам разрешено выбрасывать возвращаемое значение , которое согласуется с тем, как например , лечит C ++ voidв разрешении шаблона.

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?

Когда мы ограничиваем тип changeбыть (widget) => void, мы делаем это так , что вы можете передать в decrementWidgetHeightкачестве второго аргумента , даже если она имеет возвращаемое значение, но все же убедившись , что когда мы пишем тело applyToManyWidgets, мы случайно не использовать возвращать значение в changeлюбом месте.

Обратите внимание , что voidпо - прежнему отличается , anyпотому что это запрещенное:

function f() { }
var x = f(); // Disallowed, f() is of type 'void'
Ответил 06/10/2012 в 22:06
источник пользователем

голоса
0

Это похоже на ошибку. Вы должны открыть новый элемент для выпуска

Ответил 06/10/2012 в 18:38
источник пользователем

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