在实现服务器通信的客户端时,碰巧遇到以下问题:如何在变量中存储对接口的引用。
我有一个接口,其中包含有关特定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)是我无法提取以前分配的类型/接口的地方。
答案 0 :(得分:2)
值和类型存在于两个不同的域中。类型会在编译时删除,因此我们无法像您尝试的那样将类型分配给接口字段。
我们可以做的是在类型域中工作,并使用通用参数将data
和response
类型保留在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
};