打字稿:对变量中接口的引用

时间:2018-07-24 12:43:03

标签: angular typescript ionic-framework interface

在实现服务器通信的客户端时,碰巧遇到以下问题:如何在变量中存储对接口的引用。

我有一个接口,其中包含有关特定RESTfull后端调用的所有信息:

export interface IEndpoint {
  path: string,
  method: HTTP_METHOD,
  data: any,
  response: any
}

创建此元素的实例(ISomeInterface和IAnotherInterface是我稍后要引用的接口):

export const GET_TEST: IEndpoint = {
  path: 'api/test',
  method: HTTP_METHOD.GET,
  data: <ISomeInterface>{},
  response: <IAnotherInterface>{}
};

目标是将数据和响应字段用作Promise中的类型引用(元数据是IEndpoint的实例):

new Promise<meta.response>((resolve) => {
  ...
});

Promise的回调类型(meta.response)是我无法提取以前分配的类型/接口的地方。

3 个答案:

答案 0 :(得分:2)

值和类型存在于两个不同的域中。类型会在编译时删除,因此我们无法像您尝试的那样将类型分配给接口字段。

我们可以做的是在类型域中工作,并使用通用参数将dataresponse类型保留在IEndpoint类型中,并在需要时提取它们。

export interface IEndpoint<TData, TResponse> {
    path: string,
    method: HTTP_METHOD,
    // just here because typescript doesn't handle unused generics well
    _data?: TData,
    _response?: TResponse
}

function makeRequest<T extends IEndpoint<any, any>>(endPoint: T, data: T['_data']): Promise<T['_response']> {
    return null as any// actual call
}

interface ISomeInterface { data: string }
interface IAnotherInterface { result: string }
export const GET_TEST: IEndpoint<ISomeInterface, IAnotherInterface> = {
    path: 'api/test',
    method: "GET"
};
// Takes in ISomeInterface returns Promise<IAnotherInterface> 
makeRequest(GET_TEST, { data: ""}).then(r=> r.result);

@ jeroen-vervaeke指出,makeRequest也可以用更简单的方式输入,效果相同:

function makeRequest2<TData, TResponse>(endPoint: IEndpoint<TData, TResponse>, data: TData): Promise<TResponse>{
    return null as any;
}

答案 1 :(得分:0)

您可以使用通用类解决问题,并将方法绑定到此类:

var router = express.Router();
router.get(/getbytitle\((%22|')Data%20Set(%22|')\)\/items\/?$/i,(req,res,next)=>{
   openAndSend('./data/dataset.csv', res);
});

router.get(/getbytitle\((%22|')people(%22|')\)\/items\/?$/i,(req,res,next)=>{
   openAndSend('./data/people.csv', res);
});
app.use('/_api/lists',router);

答案 2 :(得分:-1)

您参考以下内容中的meta部分:

new Promise<meta.response>((resolve) => {
  ...
});

因为它表示一种类型,而它表示一个值。您可以使用typeof解决此问题:

new Promise<typeof (meta.response)>((resolve) => {
  ...
});

或通过直接引用响应类型:

new Promise<IAnotherInterface>(resolve => {
  ...
});

除此之外,TS团队强烈建议使用as作为演员,而不是<>

export const GET_TEST: IEndpoint = {
  path: 'api/test',
  method: HTTP_METHOD.GET,
  data: {} as,ISomeInterface
  response: {} as IAnotherInterface
};