在打字稿中抽象出常见的api类型的最佳方法是什么

时间:2017-04-05 23:38:24

标签: typescript

我有10多个搜索请求,其中包含可能被抽象的公共请求字段。例如,两个字段在它们之间是相同的,所有字段都类似于以下内容:

进行常见搜索

{ 
  name: 'purple',
  guid: '1672d0cf-08dc-4c04-9ce2-a2e6e85d1d13',
  searchType: 'common'  
}

有关访问的详细信息

{ 
  name: 'purple',
  guid: '1672d0cf-08dc-4c04-9ce2-a2e6e85d1d13',
  visitId: 35
}

APISearch.ts

之类的内容中执行以下操作会很不错
    import { search } from './APIModels.ts'

    export class commonSearch extends search {
      public searchType?: string;
    }

    export class visitRequestSearch extends search {
      public visitId: number;
    }

APIModals.ts

    export class search {
      public name?: string;
      public guid?: string;
    }

当我尝试包含基本搜索时,我收到以下错误

[at-loader] Checking finished with 1 errors
[at-loader] src\app\ApiModels.ts:12:44
    TS2507: Type 'any' is not a constructor function type.

我的小提琴手似乎认为抽象是合理的:https://jsfiddle.net/michael_shomsky/0bppt8dg/2/

那么为什么我会收到错误。我开始再次查看一些文档(https://www.typescriptlang.org/docs/handbook/advanced-types.html),看起来我应该使用某种交集,但我希望有一个可用的搜索请求库,而不是工厂;所以可能还有另一种模式,或者我搞砸了。

2 个答案:

答案 0 :(得分:2)

在以各种方式搞错之后,我意识到文件的导入方式存在错误。显然TS2507: Type 'any' is not a constructor function type.是对缺少的超级班级的回应(好吧,至少在我的情况下)。:

以下导入删除了“.ts”并开始按预期工作(类似于JSFiddle)

import { search } from './APIModels.ts'; 

需要

import { search } from './APIModels';

答案 1 :(得分:1)

对于您的用例,您似乎应该使用Typescript接口。类似的东西:

interface BaseRequest {
    name: string,
    guid: string
}

interface CommonSearch extends BaseRequest {
    searchType: string
}

interface VisitDetail extends BaseRequest {
    visitId: number
}
相关问题