具有某些特定屬性的物件 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 不相容,這導致了編譯錯誤
遊樂場連結在這裡
簡而言之,要麼需要更改您的輸入參數類型,要麼應該在本地填充返回的對象
