網站搜尋

具有某些特定屬性的物件 typescript


我有一個函數,它接受一些數據並在函數中添加一些屬性,然後返回該參數對象。

這就是我宣告它的方式

async setContext(@Body() data: { [key: string]: any }): Promise<{
        additionalData: { id: string, [key: string]: any },
        context: Context,
        [key: string]: any
    }> {
        data.additionalData.id = this._getId(data.additionalData);
        data.context = this._getContext();
        return data;
}

但這正在顯示

Type '{ [key: string]: any; }' is missing the following properties from type '{ [key: string]: any; additionalData: { [key: string]: any; id: string; }; context: Context; }': additionalData, contextts(2739)

所以我試了

async setContext(@Body() data: { additionalData?: any, context?: Context, [key: string]: any }): Promise<{
        additionalData: { id: string, [key: string]: any },
        context: Context,
        [key: string]: any
    }> {
        if (!data.additionalData) {
            data.additionalData = {};
        }
        data.additionalData.id = this._getConversationId(data.additionalData);
        data.context = this._getContext();
        return data;
}

但是現在這個正在顯示

Type '{ [key: string]: any; additionalData?: any; context?: Context; }' is not assignable to type '{ [key: string]: any; additionalData: { [key: string]: any; id: string; }; context: Context; }'.
  Property 'additionalData' is optional in type '{ [key: string]: any; additionalData?: any; context?: Context; }' but required in type '{ [key: string]: any; additionalData: { [key: string]: any; id: string; }; context: Context; }'.ts(2322)

這不應該有效,因為我正在將資料宣告為

data: { [key: string]: any }

有任何未知的特性嗎?

答案#1

我會根據函數參數的類型來定義函數的返回類型。


遊樂場


在你的情況下使用它,只需將 'foo' 和 'bar' 換成你的函數即可。


type Context = string;

type DataIn = { 
  additionalData?: unknown;
  context?: Context;
  [key: string]: unknown;
};

type DataOut = Omit<Required<DataIn>, 'additionalData'> & {
  additionalData: { 
    id: string;
    [key: string]: unknown;
  };
};

async function setContext(data: DataIn): Promise<DataOut> {
  return {
    ...data,

    additionalData: {
      ...(data.additionalData as object),

      id: 'foo',
    },

    context: 'bar',
  };
}

(async() => {
  const myData = await setContext({
    animal: 'dog',
  });

  console.log(myData);
})();

答案#2

你需要返回一個與函數簽名匹配的 promise:

async function setContext(@Body() data: { [key: string]: any }): Promise<{
        additionalData: { id: string, [key: string]: any },
        context: Context,
        [key: string]: any
    }> {
        let map:{ additionalData: { id: string, [key: string]: any }, context: Context, [key: string]: any };
        data.additionalData.id = this._getId(data.additionalData);
        data.context = this._getContext();
        return new Promise((resolve, reject) => { resolve(map) });
}

data 輸入參數的類型與 signature 不相容,這導致了編譯錯誤

遊樂場連結在這裡

簡而言之,要麼需要更改您的輸入參數類型,要麼應該在本地填充返回的對象