[英]How to check if response is of specific interface type?
我正在編寫集成測試。
它通過了,但我知道它是否通過的唯一方法是檢查響應類型是否是這樣的對象:
describe('INTEGRATION test1', () => {
it('get user from service success', async () => {
const serviceObj: IFindPropsRequest = {
find: {
findMeta: {
prop1: 'value1',
prop2: 'Individual',
}
};
const resp: ServiceResponse<IFindResponse> = await findProfileService(serviceObj, 'DE');
expect(typeof resp).toBe('object'); // want to change this
});
而不是expect(typeof resp).toBe('object');
我正在尋找一種方法來查看 resp 是否屬於IFindResponse
類型
我怎樣才能做到這一點?
簡短的回答是:你不能。 interface
是在運行時被刪除的東西,所以當你的應用程序運行時,沒有工具可以查看任意傳入的對象是否可以滿足某種類型的接口。
處理這個問題的打字稿方式是編寫一個類型保護,但它涉及您手動編寫代碼以查看傳入的類型是否滿足接口。
我們通過不使用打字稿解決了這個問題。 我們編寫 JSON-Schema 用於運行時驗證,實際上有腳本可以獲取 JSON-Schema 文件並將它們轉換為 typescript 類型以進行靜態分析。 並不是說這回答了您的問題,但這里的重點是您需要在運行時執行此操作的東西,而 Typescript 不是它。
'crazy hack' 是如果您得到響應,將其轉換為 .ts 文件並在創建的文件上手動調用打字稿編譯器......不確定這是否是你想要走的路......但這是一種可能性.
當 @Max 評論resp instanceof IFindResponse
時,您可以期望為真。
expect(resp instanceof IFindResponse).toBeTruthy();
閱讀@Evert 回答后,我以另一種方式解決了這個問題:
describe('INTEGRATION test1', () => {
it('get user from service success', async () => {
const serviceObj: IFindPropsRequest = {
find: {
findMeta: {
prop1: 'value1',
prop2: 'Individual',
}
};
const resp: ServiceResponse<IFindResponse> = await findProfileService(serviceObj, 'DE');
expect(resp.data.customers).toBeTruthy(); check if property exists
});
我基本上只是檢查響應是否具有只有在請求通過時才會具有的屬性。
相同的解決方案,但帶有類型保護:
describe('INTEGRATION test1', () => {
it('get user from service success', async () => {
const serviceObj: IFindPropsRequest = {
find: {
findMeta: {
prop1: 'value1',
prop2: 'Individual',
}
};
const resp: ServiceResponse<IFindResponse> = await findProfileService(serviceObj, 'DE');
expect(isIFindResponse(resp)).toBeTruthy();
});
function isIFindResponse(input: any): input is IFindResponse {
return input.data.customers !== undefined;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.