TypeScript 함수 오버로드
TypeScript 언어 사양 섹션 6.3에서는 함수 오버로드에 대해 설명하고 구현 방법에 대한 구체적인 예를 제시합니다.그러나 다음과 같은 작업을 시도하면:
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에서 오버로드 시 여러 시그니처를 가진 구현은 1개뿐입니다.
class Foo {
myMethod(a: string);
myMethod(a: number);
myMethod(a: number, b: string);
myMethod(a: string | number, b?: string) {
alert(a.toString());
}
}
TypeScript에서는 3개의 과부하만 메서드콜의 가능한 시그니처로 인식되며 실제 실장은 인식되지 않습니다.구현 시그니처는 모든 과부하와 호환성이 있어야 합니다.
당신의 경우 파라미터에 공통성이 부족하기 때문에 개인적으로 이름이 다른 두 가지 메서드를 사용합니다.그 때문에 메서드 본문에 조작을 결정하기 위해 많은 "if"가 필요할 수 있습니다.
이는 두 함수가 JavaScript로 컴파일될 때 시그니처가 완전히 동일하기 때문일 수 있습니다.JavaScript에는 타입이 없기 때문에 같은 수의 인수를 사용하여 2개의 함수를 작성하게 됩니다.따라서 TypeScript는 이러한 기능을 만드는 것을 제한합니다.
TypeScript는 파라미터 수에 따른 오버로드를 지원하지만, OO언어와 비교하면 따라야 할 단계가 조금 다릅니다.또 다른 SO 질문에 대한 답변으로, 누군가가 좋은 예를 들어 설명했습니다.메서드 오버로드?
기본적으로 TypeScript가 컴파일 오류를 발생시키지 않도록 함수와 선언을 1개만 만들고 있습니다.이 코드를 JavaScript로 컴파일하면 구체적인 함수만 볼 수 있습니다.JavaScript 함수는 여러 개의 인수를 전달하여 호출할 수 있기 때문에 동작합니다.
오버로드된 함수를 선언하려면 함수에 여러 개의 호출 시그니처가 있는 타입이 있다고 선언합니다.
interface IFoo
{
bar: {
(s: string): number;
(n: number): string;
}
}
다음으로 다음과 같습니다.
var foo1: IFoo = ...;
var n: number = foo1.bar('baz'); // OK
var s: string = foo1.bar(123); // OK
var a: number[] = foo1.bar([1,2,3]); // ERROR
함수의 실제 정의는 단수여야 하며 함수의 인수에 대해 내부적으로 적절한 디스패치를 수행해야 합니다.
)IFoo
꼭 는 없습니다 : 예, 예, 예, 예, 예, 예, 예, 예, 예, 예, 예, 예, 예, 예, 예, 예.
class Foo
{
public bar(s: string): number;
public bar(n: number): string;
public bar(arg: any): any
{
if (typeof(arg) === 'number')
return arg.toString();
if (typeof(arg) === 'string')
return arg.length;
}
}
여기서 은 '이것'이 '아예'라는 입니다.any
폼은 좀 더 구체적인 유형의 재정의에 의해 숨겨집니다.
var foo2: new Foo();
var n: number = foo2.bar('baz'); // OK
var s: string = foo2.bar(123); // OK
var a: number[] = foo2.bar([1,2,3]); // ERROR
타이프스크립트의 함수 오버로드:
Wikipedia(및 많은 프로그래밍 서적)에 따르면 방법/함수 오버로드의 정의는 다음과 같습니다.
일부 프로그래밍 언어에서 함수 오버로드 또는 메서드 오버로드는 다른 구현으로 동일한 이름의 함수를 여러 개 생성하는 기능입니다.과부하된 함수에 대한 호출은 콜의 컨텍스트에 적합한 특정 함수의 구현을 실행하므로 1개의 함수 호출이 컨텍스트에 따라 다른 작업을 수행할 수 있습니다.
타이프스크립트에서는 인수의 수와 유형에 따라 호출되는 동일한 함수의 다른 구현을 가질 수 없습니다.이는 TS가 JS로 컴파일될 때 JS의 함수는 다음과 같은 특성을 가지기 때문입니다.
- JavaScript 함수 정의는 매개 변수에 대한 데이터 유형을 지정하지 않습니다.
- JavaScript 함수는 호출 시 인수 수를 확인하지 않습니다.
따라서 엄밀한 의미에서 TS 함수 오버로드가 존재하지 않는다고 주장할 수 있다.그러나 TS 코드 내에서 기능 과부하를 완벽하게 모방할 수 있는 작업이 있습니다.
다음은 예를 제시하겠습니다.
function add(a: number, b: number, c: number): number;
function add(a: number, b: number): any;
function add(a: string, b: string): any;
function add(a: any, b: any, c?: any): any {
if (c) {
return a + c;
}
if (typeof a === 'string') {
return `a is ${a}, b is ${b}`;
} else {
return a + b;
}
}
TS 문서에서는 이 메서드를 오버로드라고 부릅니다.기본적으로 TS 컴파일러에 복수의 메서드시그니처(가능한 파라미터와 타입의 설명)를 제공하고 있습니다.이제 TS는 컴파일 시간 동안 함수를 올바르게 호출했는지 확인하고 함수를 잘못 호출하면 오류를 표시할 수 있습니다.
일반적으로 함수 오버로드란 무엇입니까?
함수 오버로드 또는 메서드 오버로드란 서로 다른 구현으로 동일한 이름의 여러 함수를 생성할 수 있는 기능입니다(Wikipedia
JS에서의 함수 오버로드란 무엇입니까?
이 기능은 JS에서는 사용할 수 없습니다.마지막으로 정의된 함수는 여러 선언이 있는 경우 실행됩니다.
function foo(a1, a2) { return `${a1}, ${a2}` }
function foo(a1) { return `${a1}` } // replaces above `foo` declaration
foo(42, "foo") // "42"
...그리고 TS로?
오버로드란 JS 런타임에 영향을 주지 않는 컴파일 시간 구성입니다.
function foo(s: string): string // overload #1 of foo
function foo(s: string, n: number): number // overload #2 of foo
function foo(s: string, n?: number): string | number {/* ... */} // foo implementation
위의 코드(JS보다 안전)를 사용하면 중복 구현 오류가 트리거됩니다.TS는 첫 번째 장착 오버로드를 하향식 순서로 선택하므로 과부하가 가장 구체적인 것부터 가장 넓은 것까지 정렬됩니다.
TS에서의 메서드 오버로드: 보다 복잡한 예
오버로드된 클래스 메서드유형은 함수 오버로드와 같은 방법으로 사용할 수 있습니다.
class LayerFactory {
createFeatureLayer(a1: string, a2: number): string
createFeatureLayer(a1: number, a2: boolean, a3: string): number
createFeatureLayer(a1: string | number, a2: number | boolean, a3?: string)
: number | string { /*... your implementation*/ }
}
const fact = new LayerFactory()
fact.createFeatureLayer("foo", 42) // string
fact.createFeatureLayer(3, true, "bar") // number
함수의 실장은 컴파일러에 의해 강제되는 모든 과부하 시그니처와 호환되기 때문에 매우 다른 과부하가 발생할 수 있습니다.
기타 정보:
다른 사람들에 대한 경고로서, 나는 적어도 WebPack for Angular 2에 의해 컴파일된 TypeScript에서 알 수 있듯이, 오버로드된 메서드 대신 조용히 덮어쓰기를 할 수 있다고 주장해 왔다.
myComponent {
method(): { console.info("no args"); },
method(arg): { console.info("with arg"); }
}
호출:
myComponent.method()
는 인수를 사용하여 메서드를 실행하고 no-time-version 버전을 묵살하고 출력을 사용하여 메서드를 실행하는 것처럼 보입니다.
with arg
언급URL : https://stackoverflow.com/questions/13212625/typescript-function-overloading
'programing' 카테고리의 다른 글
스트라이프: 계획 없이 반복 지불을 설정하는 방법 (0) | 2023.03.04 |
---|---|
찾을 수 없는 경우 .htaccess가 제대로 작동하지 않음/결국 리다이렉트 합니다. (0) | 2023.03.04 |
MongoDB 오픈소스 vs MongoDB Enterprise (0) | 2023.03.04 |
Oracle에서 캐시된 모든 항목을 지우는 방법 (0) | 2023.03.04 |
대규모 데이터 세트(angular.js)에 비해 ngRepeat의 성능을 향상시키는 방법 (0) | 2023.02.27 |