From 76f4824d2b447cbb80e5476289448898a2b55b0d Mon Sep 17 00:00:00 2001
From: dap <15891557205@163.com>
Date: 星期四, 28 十一月 2024 21:07:23 +0800
Subject: [PATCH] feat: i18n $t方法支持ts类型提示

---
 src/lang/index.ts     |    6 ++++--
 src/types/module.d.ts |   16 ++++++++++++++++
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/lang/index.ts b/src/lang/index.ts
index 3e69cee..4f8e74c 100644
--- a/src/lang/index.ts
+++ b/src/lang/index.ts
@@ -2,8 +2,8 @@
 import { createI18n } from 'vue-i18n';
 
 import { LanguageEnum } from '@/enums/LanguageEnum';
-import zh_CN from "@/lang/zh_CN";
-import en_US from "@/lang/en_US";
+import zh_CN from '@/lang/zh_CN';
+import en_US from '@/lang/en_US';
 
 /**
  * 鑾峰彇褰撳墠璇█
@@ -29,3 +29,5 @@
 });
 
 export default i18n;
+
+export type LanguageType = typeof zh_CN;
diff --git a/src/types/module.d.ts b/src/types/module.d.ts
index bc2f16b..9942657 100644
--- a/src/types/module.d.ts
+++ b/src/types/module.d.ts
@@ -8,6 +8,7 @@
 import { handleTree, addDateRange, selectDictLabel, selectDictLabels, parseTime } from '@/utils/ruoyi';
 import { getConfigKey, updateConfigByKey } from '@/api/system/config';
 import { download as rd } from '@/utils/request';
+import type { LanguageType } from '@/lang';
 
 export {};
 
@@ -20,6 +21,11 @@
     $auth: typeof auth;
     $cache: typeof cache;
     animate: typeof animate;
+    /**
+     * i18n $t鏂规硶鏀寔ts绫诲瀷鎻愮ず
+     * @param key i18n key
+     */
+    $t(key: ObjKeysToUnion<LanguageType>): string;
 
     useDict: typeof useDict;
     addDateRange: typeof addDateRange;
@@ -33,6 +39,16 @@
   }
 }
 
+/**
+ * { a: 1, b: { ba: { baa: 1, bab: 2 }, bb: 2} } ---> a | b.ba.baa | b.ba.bab | b.bb
+ * https://juejin.cn/post/7280062870670606397
+ */
+export type ObjKeysToUnion<T, P extends string = ''> = T extends object
+  ? {
+      [K in keyof T]: ObjKeysToUnion<T[K], P extends '' ? `${K & string}` : `${P}.${K & string}`>;
+    }[keyof T]
+  : P;
+
 declare module 'vform3-builds' {
   const content: any;
   export = content;

--
Gitblit v1.9.3