Раздел 6.3 спецификации языка TypeScript говорит о перегрузке функций и дает конкретные примеры того, как это реализовать. Однако, если я попробую что-то вроде этого:
export class LayerFactory {
constructor (public styleFactory: Symbology.StyleFactory) { }
createFeatureLayer (userContext : Model.UserContext, mapWrapperObj : MapWrapperBase) : any {
throw "not implemented";
}
createFeatureLayer(layerName : string, style : any) : any {
throw "not implemented";
}
}
Я получаю ошибку компилятора, указывающую на дубликат идентификатора, даже если параметры функции имеют разные типы. Даже если я добавлю дополнительный параметр ко второй функции createFeatureLayer, я все равно получаю ошибку компилятора. Идеи, пожалуйста.
typescript
overloading
Клаус Нджи
источник
источник
Ответы:
Это может быть потому, что, когда обе функции скомпилированы в JavaScript, их сигнатура полностью идентична. Поскольку в JavaScript нет типов, в итоге мы создаем две функции, принимающие одинаковое количество аргументов. Таким образом, TypeScript ограничивает нас от создания таких функций.
TypeScript поддерживает перегрузку в зависимости от количества параметров, но шаги, которые необходимо выполнить, немного отличаются, если сравнивать с языками OO. В ответ на другой вопрос SO кто-то объяснил это хорошим примером: перегрузка метода? ,
По сути, мы создаем только одну функцию и несколько объявлений, чтобы TypeScript не выдавал ошибок компиляции. Когда этот код скомпилирован в JavaScript, только конкретная функция будет видна. Поскольку функцию JavaScript можно вызывать, передавая несколько аргументов, она просто работает.
источник
type
, перечисления, обобщения, и т. Д., Теряются во время выполнения. Вот почему ты не можешь сделатьsomeObject instanceof ISomeInterfaceDefinedInTypeScript
.Когда вы перегружаете TypeScript, у вас есть только одна реализация с несколькими сигнатурами.
Только три перегрузки распознаются TypeScript как возможные сигнатуры для вызова метода, а не фактическая реализация.
В вашем случае я бы лично использовал два метода с разными именами, так как в параметрах недостаточно общего, что делает возможным, чтобы тело метода нуждалось в большом количестве «если», чтобы решить, что делать.
TypeScript 1.4
Начиная с TypeScript 1.4, вы обычно можете устранить необходимость перегрузки, используя тип объединения. Приведенный выше пример можно лучше выразить, используя:
Тип
a
«илиstring
илиnumber
».источник
class Foo { constructor(obj) { } constructor (a: number, b: string, c: boolean) {} }
Foo.fromObject(obj)
иFoo.fromJson(str)
и так далее.Foo.methos(1, 2, 3)
Foo.method(1)
Foo.method(Obj)
Я также заметил, что у вас есть разные методы вFoo
классе, отObject и от Json?myNum
или вmyObj
любом случае, так почему бы не иметь отдельные методы и сделать все ясно / избежать ненужной логики ветвления.Вы можете объявить перегруженную функцию, объявив функцию как имеющую тип с несколькими сигнатурами вызова:
Тогда следующее:
Фактическое определение функции должно быть единственным и выполнять соответствующую диспетчеризацию внутри своих аргументов.
Например, используя класс (который может реализовать
IFoo
, но не обязан):Здесь интересно то, что
any
форма скрыта за более конкретно напечатанными переопределениями.источник
Что такое перегрузка функций в целом?
Что такое перегрузка функций в JS?
Эта функция невозможна в JS - последняя определенная функция берется в случае нескольких объявлений:
... а в ТС?
Перегрузки являются конструкцией времени компиляции, не влияющей на время выполнения JS:
Двойная ошибка реализации возникает, если вы используете приведенный выше код (более безопасный, чем JS). TS выбирает первую фитинговую перегрузку в порядке сверху вниз, поэтому перегрузки сортируются от наиболее специфических к наиболее широким.
Перегрузка метода в TS: более сложный пример
Перегруженные типы методов класса могут использоваться аналогично перегрузке функций:
Возможны очень разные перегрузки, так как реализация функции совместима со всеми сигнатурами перегрузки - обеспечивается компилятором.
Больше информации:
источник
Как замечание к другим, я заметил, что, по крайней мере, как показывает TypeScript, скомпилированный WebPack для Angular 2, вы спокойно получаете overWRITTEN вместо overLOADED методов.
Вызов:
кажется, выполняет метод с аргументами, молча игнорируя версию без аргументов, с выводом:
источник
Duplicate function implementation
предупреждение для такого кода.Перегрузка функций в машинописи:
Согласно Википедии (и многим книгам по программированию) определение перегрузки метода / функции следующее:
В машинописном тексте мы не можем иметь разные реализации одной и той же функции, которые вызываются в соответствии с количеством и типом аргументов. Это связано с тем, что когда TS компилируется в JS, функции в JS имеют следующие характеристики:
Следовательно, в строгом смысле можно утверждать, что перегрузка функции TS не существует. Однако есть некоторые вещи, которые вы можете сделать в своем коде TS, которые могут идеально имитировать перегрузку функций.
Вот пример:
Документация TS вызывает этот метод перегрузкой, и мы в основном поставляли несколько сигнатур методов (описания возможных параметров и типов) компилятору TS. Теперь TS может выяснить, правильно ли мы вызывали нашу функцию во время компиляции, и выдать нам ошибку, если мы вызвали функцию неправильно.
источник