我正在尝试使用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)
{
// ...
}
答案 0 :(得分:2)
您可以在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);
如果你想限制能力,你也可以通过使用接口来解决这个问题
调用代码可以通过使用接口来实例化内部类的实例。下面我创建了一个简单的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);
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编译器警告。