javascript - 如何向我的 TypeScript 类添加静态方法?

标签 javascript typescript

我正在尝试使用 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/

相关文章:

javascript - map API v3 : Calculate bearing

typescript - Rxjs 将 API 结果 Observable 转换为服务函数中的另一个 Observable

javascript - 如何使用 VueJS/Typescript 导入 JSON 文件?

javascript - Angular 如何将表单组添加到 TR 组件?

javascript - Window.angular.bootstrap-警告尝试多次加载 Angular

javascript - 如何过滤列表中的内容到 map 框

javascript - 更新未定义?

javascript - Processing 2.0 javaScript 模式的示例 variableInputs 如何工作?如何调整?

node.js - Webpack 生产构建失败 : "Can' t resolve 'aws-sdk' "

reactjs - TypeScript 和 React-Redux 中的阴影名称