我正在尝试使用 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:直接在Api模块上导出函数
您可以在 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:使用接口(interface)
如果您想限制以下功能,您还可以通过使用接口(interface)来解决此问题
调用代码能够通过使用接口(interface)来实例化内部类的实例。下面我创建了一个简单的 ISuperUser
接口(interface)和名为 SuperUserImpl
的类的实现。由于 SuperUserImpl
未导出,因此它不可公开创建。这很好,因为您可以使用简单的 Api.SuperUser(2345)
来返回实现 ISuperUser
接口(interface)的类的新实例。
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 类构造函数中经常使用一个技巧,其中新对象的函数/构造函数会检查它是否属于正确的类型(是调用或创建的函数),然后如果未创建,则返回一个新实例:
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 编译器警告。
关于javascript - 如何向我的 TypeScript 类添加静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21355451/