A Seção 6.3 da especificação da linguagem TypeScript fala sobre sobrecarga de funções e fornece exemplos concretos de como implementar isso. No entanto, se eu tentar algo assim:
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";
}
}
Eu recebo um erro do compilador indicando o identificador duplicado, embora os parâmetros de função sejam de tipos diferentes. Mesmo se eu adicionar um parâmetro adicional à segunda função createFeatureLayer, ainda recebo um erro do compilador. Idéias, por favor.
typescript
overloading
Klaus Nji
fonte
fonte
Respostas:
Isso pode ocorrer porque, quando as duas funções são compiladas para JavaScript, sua assinatura é totalmente idêntica. Como o JavaScript não possui tipos, acabamos criando duas funções com o mesmo número de argumentos. Portanto, o TypeScript nos impede de criar essas funções.
O TypeScript suporta sobrecarga com base no número de parâmetros, mas as etapas a serem seguidas são um pouco diferentes se compararmos às linguagens OO. Em resposta a outra pergunta do SO, alguém explicou com um bom exemplo: Sobrecarga de método? .
Basicamente, o que estamos fazendo é criar apenas uma função e várias declarações para que o TypeScript não dê erros de compilação. Quando esse código é compilado para JavaScript, a função concreta sozinha fica visível. Como uma função JavaScript pode ser chamada passando vários argumentos, ela simplesmente funciona.
fonte
type
s, enumerações, genéricos etc. são perdidas em tempo de execução. É também por isso que você não pode fazersomeObject instanceof ISomeInterfaceDefinedInTypeScript
.Quando você sobrecarrega no TypeScript, você tem apenas uma implementação com várias assinaturas.
Somente as três sobrecargas são reconhecidas pelo TypeScript como possíveis assinaturas para uma chamada de método, não a implementação real.
No seu caso, eu pessoalmente usaria dois métodos com nomes diferentes, pois não há elementos comuns suficientes nos parâmetros, o que torna provável que o corpo do método precise ter muitos "ifs" para decidir o que fazer.
TypeScript 1.4
A partir do TypeScript 1.4, você normalmente pode remover a necessidade de sobrecarga usando um tipo de união. O exemplo acima pode ser melhor expresso usando:
O tipo de
a
é "umstring
ounumber
".fonte
class Foo { constructor(obj) { } constructor (a: number, b: string, c: boolean) {} }
Foo.fromObject(obj)
eFoo.fromJson(str)
e assim por diante.Foo.methos(1, 2, 3)
Foo.method(1)
Foo.method(Obj)
Notei também que você tem métodos diferentes naFoo
classe fromObject e fromJson?myNum
ou demyObj
qualquer maneira, por que não ter métodos separados e deixar tudo claro / evitar lógica de ramificação desnecessária.Você pode declarar uma função sobrecarregada declarando a função como tendo um tipo que possui várias assinaturas de chamada:
Então o seguinte:
A definição real da função deve ser singular e executar o despacho apropriado internamente em seus argumentos.
Por exemplo, usando uma classe (que pode implementar
IFoo
, mas não precisa):O interessante aqui é que o
any
formulário está oculto pelas substituições digitadas mais especificamente.fonte
O que é sobrecarga de função em geral?
O que é sobrecarga de função em JS?
Esse recurso não é possível no JS - a última função definida é utilizada no caso de várias declarações:
... e em TS?
Sobrecargas são uma construção em tempo de compilação sem impacto no tempo de execução JS:
Um erro de implementação duplicado é acionado, se você usar o código acima (mais seguro que o JS). O TS escolhe a primeira sobrecarga de montagem na ordem descendente, para que as sobrecargas sejam classificadas da mais específica à mais ampla.
Sobrecarga de método no TS: um exemplo mais complexo
Os tipos de métodos de classe sobrecarregados podem ser usados de maneira semelhante à sobrecarga de funções:
As sobrecargas muito diferentes são possíveis, pois a implementação da função é compatível com todas as assinaturas de sobrecarga - impostas pelo compilador.
Mais informações:
fonte
Como aviso aos outros, observei que, pelo menos como manifestado pelo TypeScript compilado pelo WebPack para Angular 2, você silenciosamente supera os métodos WRITTEN em vez de overLOADED.
A ligar:
parece executar o método com argumentos, ignorando silenciosamente a versão sem argumento, com saída:
fonte
Duplicate function implementation
aviso para código como este.Sobrecarga de função em texto datilografado:
Segundo a Wikipedia, (e muitos livros de programação), a definição de sobrecarga de método / função é a seguinte:
No texto datilografado, não podemos ter implementações diferentes da mesma função que são chamadas de acordo com o número e o tipo de argumentos. Isso ocorre porque quando o TS é compilado para JS, as funções em JS têm as seguintes características:
Portanto, em sentido estrito, pode-se argumentar que a sobrecarga da função TS não existe. No entanto, existem coisas que você pode fazer no seu código TS que podem imitar perfeitamente a sobrecarga de funções.
Aqui está um exemplo:
Os documentos do TS chamam esse método de sobrecarga, e o que basicamente fizemos foi fornecer várias assinaturas de métodos (descrições de possíveis parâmetros e tipos) ao compilador TS. Agora, o TS pode descobrir se chamamos nossa função corretamente durante o tempo de compilação e nos dar um erro se chamarmos a função incorretamente.
fonte