Typescript:强制方法接受给定的类引用

Typescript:强制方法接受给定的类引用,typescript,class,types,interface,Typescript,Class,Types,Interface,如果我有这个: 导出类JobFields实现EntityFields{}(如果有帮助,还可以从EntityFields扩展) 我可以让我的方法只接受实现/扩展EntityFields的类的引用吗?比如: private-test(entity:EntityFields){}//这不起作用,它接受任何内容 我正在创建自动读取包含后端实体信息的类的组件。我只是想强迫/诱导开发人员给它提供正确的类引用 this.test(JobFields); //this should work this.test

如果我有这个:

导出类JobFields实现EntityFields{}
(如果有帮助,还可以从EntityFields扩展)

我可以让我的方法只接受实现/扩展
EntityFields
的类的引用吗?比如:

private-test(entity:EntityFields){}//这不起作用,它接受任何内容

我正在创建自动读取包含后端实体信息的类的组件。我只是想强迫/诱导开发人员给它提供正确的类引用

this.test(JobFields); //this should work
this.test(JobView);   //while this shouldn't

您可以在Typescript中编写自定义保护函数

这里有一个例子。考虑以下事项:

IEntityFields {
    prop1: string,
    fieldprop2: {prop: string},
    metaData: {azureFilePath: string}
}

export const instanceOfEntityFields = (_o: any): _o is EntityFields => {
  return 'prop1' in _o && 'fieldprop2' in _o.metaData && 'azureFilePath' in _o.metaData;
};
然后在方法调用中,可以使用检查

private test(entity: EntityFields) {
    return instanceOfEntityFields(entity)
        ? //...do work here
        : false;
}
这是一个很酷的模式,因为您可以堆叠检查; e、 g


您可以在Typescript中编写自定义保护函数

这里有一个例子。考虑以下事项:

IEntityFields {
    prop1: string,
    fieldprop2: {prop: string},
    metaData: {azureFilePath: string}
}

export const instanceOfEntityFields = (_o: any): _o is EntityFields => {
  return 'prop1' in _o && 'fieldprop2' in _o.metaData && 'azureFilePath' in _o.metaData;
};
然后在方法调用中,可以使用检查

private test(entity: EntityFields) {
    return instanceOfEntityFields(entity)
        ? //...do work here
        : false;
}
这是一个很酷的模式,因为您可以堆叠检查; e、 g


我喜欢这样,但这样,当我用其他东西(比如字符串或数字)调用“test”方法时,tslint仍然不会说任何话,因此它不会帮助metslint捕捉到调用对象类型错误的方法进行输入。您确定IDE已安装并启用tslint和/或eslint吗?另外,也请仔细检查项目的tslint配置。请检查:在您的示例中,它在运行时中断,没有tslint告诉我我给了它错误的实体,对不起,如果我不清楚的话。如果您实际使用一些属性定义接口,它会告诉您类型不匹配。看起来我可以编辑,我喜欢这样,但是这样,当我用其他东西(比如字符串或数字)调用“test”方法时,tslint仍然不会说任何话,所以它不会帮助metslint捕捉到调用对象类型错误的方法进行输入。您确定IDE已安装并启用tslint和/或eslint吗?另外,也请仔细检查项目的tslint配置。请检查:在您的示例中,它在运行时中断,没有tslint告诉我我给了它错误的实体,对不起,如果我不清楚的话。如果您实际使用一些属性定义接口,它会告诉您类型不匹配。看起来我可以编辑