簡體   English   中英

如何檢查響應是否屬於特定接口類型?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM