我正在尝试使用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
模块上function
aApi
来检索/创建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编译器警告。