programing

TypeScript에서 일반 클래스의 정적 함수 호출

nicescript 2023. 6. 11. 21:43
반응형

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

반응형