31 lines
1006 B
TypeScript
31 lines
1006 B
TypeScript
import defaultLocale from '../../locales/ru.json';
|
|
|
|
type Split<S extends string, D extends string> =
|
|
S extends `${infer A}${D}${infer B}` ? [A, ...Split<B, D>] : [S];
|
|
|
|
type NestedObject<T extends string[]> =
|
|
T extends [infer Head, ...infer Tail] ?
|
|
Head extends string ?
|
|
{ [key in Head]: NestedObject<Tail extends string[] ? Tail : []> } : never :
|
|
string;
|
|
|
|
// Основная утилита для обработки union type
|
|
type CreateTree<T> =
|
|
UnionToIntersection<T extends infer U ?
|
|
U extends string ?
|
|
NestedObject<Split<U, '.'>> : never : never>;
|
|
|
|
// Утилита для объединения типов
|
|
type UnionToIntersection<U> =
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
(U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
|
|
|
|
type LanguageResource = CreateTree<keyof typeof defaultLocale>;
|
|
|
|
declare module "i18next" {
|
|
interface CustomTypeOptions {
|
|
resources: {
|
|
'~': LanguageResource
|
|
};
|
|
}
|
|
} |