如何向TypeScript类添加静态方法?

时间:2014-01-25 19:50:47

标签: javascript typescript

我正在尝试使用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);

我的TypeScript:

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)
{
    // ...
}

1 个答案:

答案 0 :(得分:2)

选项1:直接在Api模块上导出功能

您可以在export模块上function Api来检索/创建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 /构造函数检查它是否是正确的类型(是函数调用还是创建),如果没有创建,返回一个新实例:

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);

编译器警告表示,“你忘了使用'新'吗?”只需发出警告,它就会生成有效的JavaScript。我可能会采用类似静态的方法来避免TypeScript编译器警告。