我正在尝试使用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()类中添加一个未命名的静态,但这是不对的。
static (id : number)
{
    // ...
}

最佳答案

选项1:直接在api模块上导出函数
您可以在export模块上functionaApi来检索/创建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);

编译器警告说,“你忘了使用‘new’了吗?”它确实生成了有效的javascript,只是有一个警告。我可能会使用类似静态的方法来避免typescript编译器警告。

09-20 23:03
查看更多