javascript - 有条件地在基类上指定方法/ Prop

标签 javascript typescript oop

与其他 JS 开发人员一样,我对以 TypeScript 编译器可以理解的静态方式编写内容有些陌生。我的基本用例是自定义通用类上可用的操作以访问 REST 端点。我可以根据构造函数参数动态地将方法/ Prop 添加到基类,但是动态地(可以理解地)做一些事情会使智能感知不正确。我知道我只是在想这个错误,并且有不同的范例来实现我想要的。我如何以编译器理解的方式从子类自定义基类?

这是我正在尝试的:

class Endpoint<T> {
    constructor(
        methods: Array<'GET' | 'CREATE'>
    ) {
        // Conditionally add methods to the endpoint based on what was passed in
        if (methods.includes('GET')) {
            this.get = function get(id: string): Promise<T> {
                return new Promise<T>(resolve => resolve());
            };
        }
        if (methods.includes('CREATE')) {
            this.create = function create(body: T): Promise<T> {
                return new Promise<T>(resolve => resolve());
            };
        }
    }

    public get?: (id: string) => Promise<T>;
    public create?: (body: T) => Promise<T>;
}

class User extends Endpoint<IUser> {
    constructor() {
        super(['GET']);
    }
}

let u = new User();
// u.create will get transpiled away, but still shows up in intellisense

最佳答案

您可以缩短这段代码,但它并不漂亮,但基本思想是使用 mixins在 Typescript 2.2 中引入:

class Endpoint<T> {
}

type Constructor<T> = new(...args: any[]) => T;

function Gettable<T, U extends Constructor<Endpoint<T>> = typeof Endpoint>(Base: U) {
   return class extends Base {
        get(id: string): Promise<T> {
            return new Promise<T>(resolve => resolve());
        }
    }
}

function Createable<T, U extends Constructor<Endpoint<T>> = typeof Endpoint>(Base: U) {
    return class extends Base {
        create(body: T): Promise<T> {
            return new Promise<T>(resolve => resolve());
        }
    }
}

class User extends Gettable<IUser>(Endpoint)<IUser> {
}

const u = new User();
u.get("id"); // ok
u.create(); // error, method doesn't exist

关于javascript - 有条件地在基类上指定方法/ Prop ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47837342/

相关文章:

javascript - KineticJS 的 iOS 滚动/捏缩放问题

javascript - 如何显示对象数组中的特定对象(Angular 5、TypeScript)

基于第一个参数的函数参数动态类型

javascript - 在 Angular 2 中的非父/子关系组件之间传递值

typescript - 类型 'T' 不可分配给 TypeScript 中的类型 'T extends T ? T : T'

c# - 在哪里初始化专门的 wpf 控件?

java - 更好的替代方法是使用 Void 作为可选参数

php - 在类中设置变量

javascript - MapBox 方向——获取自己的 Lat 和 Lng 方向

javascript - 在 php 代码中嵌入 javascript