From 66cc9416e4b8072414bb24c26f75ab859537db25 Mon Sep 17 00:00:00 2001
From: shilangyu <xmarcinmarcin@gmail.com>
Date: Mon, 1 Mar 2021 21:33:57 +0100
Subject: [PATCH] Improve type safety

---
 generate_translations.js | 18 +++++++++++-------
 src/shared/i18next.ts    |  6 ++++--
 2 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/generate_translations.js b/generate_translations.js
index 313e800..594f574 100644
--- a/generate_translations.js
+++ b/generate_translations.js
@@ -32,17 +32,17 @@ const baseLanguage = "en";
 fs.readFile(`${translationDir}${baseLanguage}.json`, "utf8", (_, fileStr) => {
   const keys = Object.keys(JSON.parse(fileStr));
 
-  const data = `import * as i18n from "i18next";
-
-type I18nKeys = 
-${keys.map(key => `  | "${key}"`).join("\n")};
+  const data = `import { i18n } from "i18next";
 
 declare module "i18next" {
-  export interface TFunction {
+  export type I18nKeys = 
+${keys.map(key => `    | "${key}"`).join("\n")};
+  
+  export interface TFunctionTyped {
     // basic usage
     <
       TResult extends TFunctionResult = string,
-      TInterpolationMap extends object = StringMap
+      TInterpolationMap extends Record<string, unknown> = StringMap
     >(
       key: I18nKeys | I18nKeys[],
       options?: TOptions<TInterpolationMap> | string
@@ -50,13 +50,17 @@ declare module "i18next" {
     // overloaded usage
     <
       TResult extends TFunctionResult = string,
-      TInterpolationMap extends object = StringMap
+      TInterpolationMap extends Record<string, unknown> = StringMap
     >(
       key: I18nKeys | I18nKeys[],
       defaultValue?: string,
       options?: TOptions<TInterpolationMap> | string
     ): TResult;
   }
+
+  export interface i18nTyped extends i18n {
+    t: TFunctionTyped;
+  }
 }
 `;
 
diff --git a/src/shared/i18next.ts b/src/shared/i18next.ts
index 9928903..3d3d5a1 100644
--- a/src/shared/i18next.ts
+++ b/src/shared/i18next.ts
@@ -1,4 +1,4 @@
-import i18next from "i18next";
+import i18next, { i18nTyped } from "i18next";
 import { getLanguage } from "./utils";
 import { en } from "./translations/en";
 import { el } from "./translations/el";
@@ -82,4 +82,6 @@ i18next.init({
   interpolation: { format },
 });
 
-export { i18next as i18n, resources };
+export const i18n = i18next as i18nTyped;
+
+export { resources };
-- 
2.44.1