определение типа переноса третьей библиотечной функции - PullRequest
1 голос
/ 28 января 2020

Я использую Typescript для обеспечения неизменности. Большинство библиотек не вводят параметры экспортируемых функций как Readonly (или DeepReadonly), даже если они не изменяют их. Это вызывает общую проблему, поскольку ReadonlyArray нельзя назначить как Array.
. Мы можем переопределить функцию, используя расширение модуля, как объяснено в этом SOF . Но как мы можем обернуть существующее определение типа, поэтому мы используем текущее определение, но определяем все параметры как DeepReadonly?

1 Ответ

0 голосов
/ 30 января 2020

Я думаю, вы можете использовать этот шаблон c:

export type DeepReadonlyObject<A> = { readonly [K in keyof A]: DeepReadonlyObject<A[K]> };

Он сопоставляет все атрибуты с readonly, а все значения с DeepReadonlyObject значениями рекурсивно.

Детская площадка

------------- Отредактировано ---------------

Вы можете перезаписать импортированные типы по синтаксису declare module "Lib" {. Однако в определении модуля мы не можем использовать итерации. Поэтому я боюсь, что вы должны объявлять каждый ключ вручную, например

module "Lib" { 
    export const value = { key: 42 };
    export const value1 = { key: 42 };
}

declare module "Lib" {
    export type value = DeepReadonlyObject<typeof Lib.value>;
}

К сожалению, каждый ключ должен быть помещен в объявленный модуль.

...