Javascript 如何向TypeScript类添加静态方法?
我正在尝试使用TypeScript定义一个API,以便它可以像这样工作:Javascript 如何向TypeScript类添加静态方法?,javascript,typescript,Javascript,Typescript,我正在尝试使用TypeScript定义一个API,以便它可以像这样工作: //创建新用户(工作) var user:IUser=newapi.user({firstName:“John”,lastName:“Smith”}); //删除现有用户(正在工作) Api.用户.删除(1); //加载现有用户(不确定如何实现) var user=Api.user(123); 我的打字稿: 模块Api { 导出类用户 { 建造师(id:编号) 构造函数(用户:IUser) 构造函数(用户?:任意) {
//创建新用户(工作)
var user:IUser=newapi.user({firstName:“John”,lastName:“Smith”});
//删除现有用户(正在工作)
Api.用户.删除(1);
//加载现有用户(不确定如何实现)
var user=Api.user(123);
我的打字稿:
模块Api
{
导出类用户
{
建造师(id:编号)
构造函数(用户:IUser)
构造函数(用户?:任意)
{
// ...
}
静态删除(id:number){}
}
}
我不知道如何使用静态方法Api.User()
,即不使用new
。我不知道该怎么称呼这种类型的结构,这使得研究变得很困难(
我确实尝试过向User
类添加一个未命名的static,但这不对
static (id : number)
{
// ...
}
选项1:直接在Api模块上导出函数
您可以在Api
模块上导出函数
,以检索/创建用户
实例:
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) => {
};
}
if (!(this instanceof User)) {
return new User(id);
}
您不能将类命名为User
,而函数也不能命名为User
,因此我在示例中将其更改为GetUser
然后你可以打电话:
Api.GetUser(1234)
或
选项2:使用接口
如果您想限制
通过使用接口来实例化内部类的实例来调用代码。下面我创建了一个简单的ISuperUser
接口和名为SuperUserImpl
的类的实现。由于SuperUserImpl
没有导出,因此它不可公开创建。这很好,因为您可以为我们提供e simpleApi.SuperUser(2345)
返回实现issuperuser
接口的类的新实例
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类构造函数中经常使用一个技巧,其中新对象的函数/构造函数检查其类型是否正确(函数是否已调用或创建),如果未创建,则返回一个新实例:
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) => {
};
}
if (!(this instanceof User)) {
return new User(id);
}
虽然正确,但在尝试调用构造函数时键入脚本,这将导致编译器警告。这将起作用,但编译器警告:
constructor(id: Number) {
if (!(this instanceof User)) {
return new User(id);
}
}
稍后致电:
var u: Api.User = Api.User(543);
编译器警告提示:“您是否忘记使用‘new’?”它确实产生了有效的JavaScript,只是有一个警告。我可能会使用类似静态的方法来避免TypeScript编译器警告。谢谢,这是我以前见过的选项3,也是我的目标;但是我没有发布过,在我看到使用它的地方,他们在违背编译器的建议的情况下这样做。这是有价值的国王,谢谢。