将接口存储在对象中



想象我有以下接口

interface IMarket {
    ID: number,
    Name: string,
    MarketDescription: string
}
interface IDepartment {
    ID: number,
    Name: string,
    DepartmentDescription: string
}

有没有办法将接口存储在这样的对象中?

var typeMap = { Markets: IMarket, Departments: IDepartment }

我想做这样的事情。我想根据我传递到构造函数的字符串值动态设置" getQueryResults"的通用类型。

export class Service {
    protected baseURL = "";
    protected typeName = "";
    private typeMap = { Markets: IMarket, Departments: IDepartment }
    constructor(typeName) {
        this.baseURL = 'http://localhost/API/odata/' + typeName;
        this.currentType = typeMap[typeName];
    }
    getQueryResults(): Promise<this.currentType> {
        return new Promise<this.currentType>((resolve, reject) => {
            $.getJSON(this.baseURL, function (returnValue) {
                resolve(returnValue.value);
            });
        })
    }
}
var marketService = new Service("Markets");
var topMarket = marketService.getQueryResults();
//topMarket is an instance(?) of IMarket
var departmentService = new Service("Departments");
var topDepartment = departmentServicegetQueryResults();
//topDepartment is an instance(?) of IDepartment

可以简单地使用仿制药来解决,这正是它的目的:

export class Service<T> {
    protected baseURL = "";
    constructor() {
        this.baseURL = 'http://localhost/API/odata/' + typeName;
    }
    getQueryResults(): Promise<T> {
        return new Promise<T>((resolve, reject) => {
            $.getJSON(this.baseURL, function (returnValue) {
                resolve(returnValue.value);
            });
        })
    }
}
var marketService = new Service<IMarket>();
var topMarket: Promise<IMarket> = marketService.getQueryResults();
var departmentService = new Service<IDepartment>();
var topDepartment: Promise<IDepartment> = departmentService.getQueryResults();

编辑

您可以使用另外2个类来"摆脱"多次使Service<TYPE>多一次(每类):

export abstract class Service<T> {
    protected baseURL = "";
    constructor() {
        this.baseURL = 'http://localhost/API/odata/' + this.getTypeName();
    }
    getQueryResults(): Promise<T> {
        return new Promise<T>((resolve, reject) => {
            $.getJSON(this.baseURL, function (returnValue) {
                resolve(returnValue.value);
            });
        })
    }
    protected abstract getTypeName(): string;
}
export class MarketsService extends Service<IMarket> {
    protected getTypeName(): string {
        return "Markets";
    }
}
export class DepartmentsService extends Service<IDepartment> {
    protected getTypeName(): string {
        return "Departments";
    }
}
var marketService = new MarketsService();
var topMarket: Promise<IMarket> = marketService.getQueryResults();
var departmentService = new DepartmentsService();
var topDepartment: Promise<IDepartment> = departmentService.getQueryResults();

但是,与每次使用Service时需要指定类型不同,这些额外的类将是编译JS的一部分,因此这是对您更重要的问题。

从打字稿文档中获取注释:

http://www.typescriptlang.org/docs/handbook/namespaces.html#namespaced-validators

namespace Validation {
    export interface StringValidator {
        isAcceptable(s: string): boolean;
    }

看来您想要:

namespace YourNamespace {
    export interface IMarket {
        ID: number,
        Name: string,
        MarketDescription: string
    }
    export interface IDepartment {
        ID: number,
        Name: string,
        DepartmentDescription: string
    }
}

最新更新