我有一個宣告如下的函式:
export const buildLocalizedInfo = <T extends { id: number }, U extends { target: string }>(
recordBuilder: (record: any) => T,
propsMapper: readonly U[],
): T
我這樣使用:
const bounties = buildLocalizedInfo(
(record) => ({
id: record['m_ID'],
}),
[{ target: 'name' }],
);
我希望回傳型別buildLocalizedInfo為 be T & {name: string},除了它還應該擴展到我在輸入陣列中傳遞的任何屬性。
例如,
const bounties = buildLocalizedInfo(
(record) => ({
id: record['m_ID'],
other: record['other'],
}),
[{ target: 'name' }, { target: 'description' }],
);
應該決議bounties為 type { id: string; other: string; name: string; description: string}。
這在打字稿中可能嗎?
uj5u.com熱心網友回復:
是的,您只需要將結果與元素的映射型別相交,但是由于您將它們全部映射到字串,所以 aRecord就可以了:
export const buildLocalizedInfo = <T extends { id: number }, U extends { target: string }>(
recordBuilder: (record: any) => T,
propsMapper: readonly U[],
): T & Record<U["target"], string>;
但是,您可能需as const要這樣做。如果你不喜歡這樣,那么你可以使用它來代替:
type Narrow<T> =
| (T extends infer U ? U : never)
| Extract<T, number | string | boolean | bigint | symbol | null | undefined | []>
| ([T] extends [[]] ? [] : { [K in keyof T]: Narrow<T[K]> });
export const buildLocalizedInfo = <T extends { id: number }, U extends readonly { target: string }[]>(
recordBuilder: (record: any) => T,
propsMapper: Narrow<U>,
): T & Record<U[number]["target"], string>;
此Narrow實用程式將為我們縮小型別,您可以在此處查看。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/510441.html
標籤:打字稿仿制药类型
