類似于Object is of type 'unknown' typescript generics但該問題沒有在問題中指定回傳型別。
我有一些現有的作業 JS 代碼,它們使用經典JSON.parse(JSON.stringify())技術來克隆物件。
當我第一次把它變成 TS 時,我曾經Record<string, unknown>指定它會回傳一個帶有字串鍵和未知值的物件。
const deepClone = (
object: Record<string, unknown>
): Record<string, unknown> => {
return JSON.parse(JSON.stringify(object));
};
這作業正常。但是我隨后意識到接受和回傳陣列所需的函式,所以我添加了:
const deepClone = (
object: Record<string, unknown> | Array<unknown>
): Record<string, unknown> | Array<unknown> => {
return JSON.parse(JSON.stringify(object));
};
但這未能通過測驗:
describe(`deepClone`, () => {
it(`Deep clones object`, () => {
const names = ["frank"];
const original = { names };
const clone = deepClone(original);
names.push("nancy");
expect(clone.names).toEqual(["frank"]);
});
});
Property 'names' does not exist on type 'unknown[]'.
我理解錯誤 - 即使物件可以,陣列也不能具有屬性“名稱”。
這需要泛型!所以遵循泛型檔案
const deepClone = <Type>(
object: Record<string, unknown> | Array<unknown>
): Type => {
return JSON.parse(JSON.stringify(object));
};
但是,這仍然失敗:
error TS2571: Object is of type 'unknown'.
如何將 TypeScript 泛型用于可以回傳物件或陣列的函式?
uj5u.com熱心網友回復:
也許我錯過了一些東西,但我認為這只是定義泛型型別T并使用T函式引數以及回傳值的問題:
const deepClone = <T extends Record<string, unknown> | Array<unknown>>
(object: T): T => {
return JSON.parse(JSON.stringify(object));
};
const o = deepClone({a: 1});
const a = deepClone(['a', 1]);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/339398.html
上一篇:使用泛型回傳型別引數Java
