如何检查实例成员类型是否与TypeScript中的实例接口相同?

时间:2017-05-23 09:17:51

标签: typescript

我有一个config.js文件:

window.cb_c07d1fb54766d45482d({
    "descriptionMaxLength": 100
});

我按照这样加载:

interface TemplateData {
    descriptionMaxLength: number;
}

private getTemplateData(): Promise<TemplateData> {
    return new Promise<TemplateData>((resolve, reject) => {
        (window as any)[cb_c07d1fb54766d45482d] = (data: any) => { // the callback func is hardcoded here in order to simplify the reading
            resolve(data); // implicit cast
        };

        scriptInclude(url);
    });
}

这段代码效果很好,但是如果在我的配置中出错,它就不会破坏:

window.cb_c07d1fb54766d45482d({
    "descriptionMaxLength": "break my code", // mistake
});

这里,descriptionMaxLength加载将是一个字符串,即使它在接口中被描述为数字。

因此,为了确保配置文件有效,我可以这样做:

private checkType(data: TemplateData): boolean {
    return typeof data.descriptionMaxLength === "number";
}

但我发现有两个问题:

  1. 如果我的配置文件很重(如200行)
  2. ,那将是很多无聊的工作
  3. 如果我决定更改类型,但我忘了改变它 方法,我介绍了一个错误。
  4. 所以我想知道在Typescript中是否有一个泛型方法来确保对象的成员与它实现的接口具有相同的类型?

    感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

我认为您可以尝试强制tsc / IDE检查配置文件的有效性而不是您。在config.ts文件中声明您的设置结构和实际设置,如下所示:

export interface ISettings
{
    descriptionMaxLength: number;
}

export const Settings: ISettings =
{
    descriptionMaxLength : 123,
};

然后在你的代码中导入它们如下:

import {Settings} from './config';

如果由于某种原因不使用模块,只要config.ts成为项目的一部分并进行编译,您仍然可以使用类似的方法。一旦有人犯了错误 - 你的构建将被破坏,IDE也会抱怨。

答案 1 :(得分:0)

您可以使用名为Declaration Merging的TypeScript功能,以便在Window中声明一个额外的对象。

interface Window {
    cb_c07d1fb54766d45482d: (config: {
        descriptionMaxLength: number
    }) => any;
}
interface TemplateData {
    descriptionMaxLength: number;
}

window.cb_c07d1fb54766d45482d({
    descriptionMaxLength: 100
});

function getTemplateData(): Promise<TemplateData> {
    return new Promise<TemplateData>((resolve, reject) => {
        window.cb_c07d1fb54766d45482d = (data: any) => { 
            resolve(data);
        };
    });
}

我认为像这个例子的东西对你有用。