Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何向TypeScript类添加静态方法?_Javascript_Typescript - Fatal编程技术网

Javascript 如何向TypeScript类添加静态方法?

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) 构造函数(用户?:任意) {

我正在尝试使用TypeScript定义一个API,以便它可以像这样工作:

//创建新用户(工作)
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 simple
Api.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,也是我的目标;但是我没有发布过,在我看到使用它的地方,他们在违背编译器的建议的情况下这样做。这是有价值的国王,谢谢。