【问题标题】:How do I add a static method to my TypeScript class?如何向我的 TypeScript 类添加静态方法?
【发布时间】:2014-01-25 19:50:47
【问题描述】:

我正在尝试使用 TypeScript 定义一个 API,以便它可以像这样工作:

// Create new user (Working)
var user : IUser = new Api.User({ firstName: "John", lastName: "Smith" });

// Delete existing user (Working)
Api.User.Delete(1);

// Load existing user (Unsure how to implement)
var user = Api.User(123);

我的打字稿:

module Api
{
    export class User
    {
        constructor(id : number)
        constructor(user : IUser)
        constructor(user? : any)
        {
            // ...          
        }

        static Delete(id : number) {}
    }
}

我不确定如何使用静态方法Api.User(),即不使用new。我不知道如何称呼这种类型的构造,这使得研究变得困难。 :(

我确实尝试将未命名的静态添加到 User 类,但这是不对的。

static (id : number)
{
    // ...
}

【问题讨论】:

    标签: javascript typescript


    【解决方案1】:

    方案一:直接在Api模块上导出函数

    您可以在Api 模块上通过exportfunction 检索/创建User 实例:

    module Api
    {
        export class User
        {
        }
    
        export function GetUser(id: number):User {
            return new User();
        }
        // or a slightly different syntax (which generates different JavaScript):
        export var Delete = (id: number) => {
    
        };  
    }
    

    您不能将名为 User 的类和 function 也命名为 User,因此我在示例中将其更改为 GetUser

    然后你可以调用:

    Api.GetUser(1234)
    

    Api.Delete(1234);
    

    选项 2:使用接口

    如果您想限制 通过使用接口来实例化内部类的实例来调用代码。下面我创建了一个简单的ISuperUser 接口和名为SuperUserImpl 的类的实现。由于 SuperUserImpl 未导出,因此不可公开创建。这很好,因为您可以使用简单的Api.SuperUser(2345) 返回实现ISuperUser 接口的类的新实例。

    module Api {    
        export interface ISuperUser {       
            id: Number;
            name: String;
        }   
        class SuperUserImpl implements ISuperUser
        {
            constructor(public id: Number) {                        
            }               
            public name: String;
        }   
    
        export var SuperUser = (id:Number):ISuperUser => {
            return new SuperUserImpl(id);       
        }   
    }
    
    var su : Api.ISuperUser = Api.SuperUser(5432);
    alert(su.id);
    

    选项 3:JavaScript 和 instanceof

    在 JavaScript 类构造函数中经常使用一个技巧,其中 function/constructor 用于检查新对象的类型是否正确(函数是调用还是创建),如果没有创建,则返回一个新实例:

    if (!(this instanceof User)) {
        return new User(id);
    }
    

    虽然正确,但 TypeScript 在尝试调用构造函数时会导致编译器警告。这会起作用,但会出现编译器警告:

    constructor(id: Number) {
        if (!(this instanceof User)) {
           return new User(id);
        }
    }           
    

    后来调用:

    var u: Api.User = Api.User(543);
    

    编译器警告提示:“您是否忘记使用 'new'?”它确实生成了有效的 JavaScript,只是带有警告。我可能会使用类似静态的方法来避免 TypeScript 编译器警告。

    【讨论】:

    • 谢谢,这是我以前见过的选项 3,并且正在瞄准;但是我还没有在我看到它使用过的地方发布它,他们这样做是违反编译器的建议的。它现在可以工作了。谢谢。
    猜你喜欢
    • 2018-03-21
    • 1970-01-01
    • 2016-02-27
    • 2021-03-18
    • 2023-03-25
    • 2020-11-12
    • 2021-05-17
    • 2020-05-07
    • 2021-04-09
    相关资源
    最近更新 更多