TypeScript에서 일반 클래스의 정적 함수 호출
일반 클래스가 지정되었습니다.Foo<T>
정적으로factory
방법:
class Foo<T>
{
public static factory(item: T): Foo<T>
{
return null;
}
}
컴파일이 안 되는 이유는 무엇입니까?
var f = Foo<number>.factory(1);
오류 메시지:
오류 TS2069: 매개 변수 목록은 일반 형식 인수 목록 뒤에 와야 합니다.'('가 예상됩니다.
그러나 컴파일은 다음과 같습니다.
var f = Foo<number>().factory(1);
괄호가 필요한 이유는 무엇입니까?이것이 생성자를 호출하는 것입니까?
정적 메서드가 인스턴스 멤버에 액세스할 수 없는 것과 마찬가지로 정적 메서드도 인스턴스 유형 인수를 사용할 수 없습니다.
따라서 정적 메서드는 일반적이어야 하며 형식 인수를 사용해야 합니다.다음을 사용하여 강조합니다.U
정적 함수에서, 그리고T
학급에서다음의 인스턴스 유형을 기억하는 것이 중요합니다.T
의 정적 메서드 유형과 동일하지 않습니다.U
.
class Foo<T>
{
public static factory<U>(item: U): Foo<U>
{
return new Foo<U>();
}
instanceMethod(input: T) : T
{
return input;
}
}
그런 다음 괄호 바로 앞에 type 인수를 전달하여 호출합니다.
var f: Foo<number> = Foo.factory<number>(1);
형식 추론이 가능하면 형식 주석을 삭제할 수 있습니다.
var f: Foo<number> = Foo.factory(1);
변수f
의 예입니다.Foo
의 형식적인 주장하여number
그래서instanceMethod
메서드는 형식 값만 허용합니다.number
(또는)any
).
f.instanceMethod(123); // OK
f.instanceMethod('123'); // Compile error
여기서 중요한 점은 정적 일반 템플릿이 클래스(따라서 인스턴스) 템플릿과 관련이 없다는 것입니다.그래서 우리는 그것들을 구별하기만 하면 됩니다 (C#에서처럼)
// generic here is T
class Foo<T>
{
public TheT: T;
constructor(t: T)
{
this.TheT = t;
}
// the static one is U
public static factory<U>(item: U): Foo<U>
{
var result = new Foo<U>(item);
// the U here will be T inside of the instance
return result;
}
}
우리는 이렇게 부를 수 있습니다.
var f = Foo.factory(<Number> 1);
내 생각에 지금 일어나고 있는 일은 TypeScript 컴파일러가 보고 있는 것입니다.Foo<number>
그리고 이것이 물체 유형일 것으로 예상하고 있습니다.
var f: Foo<number>;
클래스가 javascript의 범위 함수로 컴파일되므로 괄호를 추가할 때 객체를 효과적으로 초기화합니다.
Typescript는 아마도 컴파일 오류를 발생시킬 것입니다.()
당신이 수업을 초기화하려고 의도했다고 가정할 수 없기 때문입니다.
언급URL : https://stackoverflow.com/questions/24291216/calling-a-static-function-on-a-generic-class-in-typescript
'programing' 카테고리의 다른 글
속성 'code'가 'Error' 유형에 없습니다. (0) | 2023.06.11 |
---|---|
EPLUS 사용 스프레드시트에서 모든 셀을 TEXT로 포맷하려는 경우 (0) | 2023.06.11 |
왜 파이썬 3.x의 슈퍼() 마법인가요? (0) | 2023.05.22 |
Linux/ubuntu 터미널 또는 bash에서 모든 기록을 영구적으로 지우는 방법은 무엇입니까? (0) | 2023.05.22 |
경고:번들 리소스 복사 빌드 단계에 이 대상의 Info.plist 파일이 포함되어 있습니다. (0) | 2023.05.22 |