diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,10 @@
 
 ## Unreleased
 
+## 0.6.4.0
+
+* Fix type for maps with non-string keys (#46, fixes #28, thanks @tfausak!)
+
 ## 0.6.3.0
 
 * GHC 9.8 support
diff --git a/aeson-typescript.cabal b/aeson-typescript.cabal
--- a/aeson-typescript.cabal
+++ b/aeson-typescript.cabal
@@ -1,11 +1,11 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.36.0.
+-- This file has been generated from package.yaml by hpack version 0.37.0.
 --
 -- see: https://github.com/sol/hpack
 
 name:           aeson-typescript
-version:        0.6.3.0
+version:        0.6.4.0
 synopsis:       Generate TypeScript definition files from your ADTs
 description:    Please see the README on Github at <https://github.com/codedownio/aeson-typescript#readme>
 category:       Text, Web, JSON
diff --git a/src/Data/Aeson/TypeScript/Instances.hs b/src/Data/Aeson/TypeScript/Instances.hs
--- a/src/Data/Aeson/TypeScript/Instances.hs
+++ b/src/Data/Aeson/TypeScript/Instances.hs
@@ -4,6 +4,7 @@
 {-# LANGUAGE OverlappingInstances #-}
 {-# LANGUAGE CPP #-}
 {-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE TypeApplications #-}
 {-# OPTIONS_GHC -fno-warn-orphans #-}
 
 -- Note: the OverlappingInstances pragma is only here so the overlapping instances in this file
@@ -171,13 +172,18 @@
 instance TypeScript A.Value where
   getTypeScriptType _ = "any";
 
-instance (TypeScript a, TypeScript b) => TypeScript (Map a b) where
-  getTypeScriptType _ = "{[k in " ++ getTypeScriptKeyType (Proxy :: Proxy a) ++ "]?: " ++ getTypeScriptType (Proxy :: Proxy b) ++ "}"
-  getParentTypes _ = [TSType (Proxy :: Proxy a), TSType (Proxy :: Proxy b)]
+instance (TypeScript a, TypeScript b, A.ToJSONKey a) => TypeScript (Map a b) where
+  getTypeScriptType =
+    let k = getTypeScriptKeyType @a Proxy
+        v = getTypeScriptType @b Proxy
+    in const $ case A.toJSONKey @a of
+      A.ToJSONKeyText{} -> "{[k in " <> k <> "]?: " <> v <> "}"
+      A.ToJSONKeyValue{} -> getTypeScriptType @[(a, b)] Proxy
+  getParentTypes = const $ L.nub [TSType @a Proxy, TSType @b Proxy]
 
-instance (TypeScript a, TypeScript b) => TypeScript (HashMap a b) where
-  getTypeScriptType _ = [i|{[k in #{getTypeScriptKeyType (Proxy :: Proxy a)}]?: #{getTypeScriptType (Proxy :: Proxy b)}}|]
-  getParentTypes _ = L.nub [TSType (Proxy :: Proxy a), TSType (Proxy :: Proxy b)]
+instance (TypeScript a, TypeScript b, A.ToJSONKey a) => TypeScript (HashMap a b) where
+  getTypeScriptType = const $ getTypeScriptType @(Map a b) Proxy
+  getParentTypes = const $ getParentTypes @(Map a b) Proxy
 
 #if MIN_VERSION_aeson(2,0,0)
 instance (TypeScript a) => TypeScript (A.KeyMap a) where
diff --git a/src/Data/Aeson/TypeScript/Lookup.hs b/src/Data/Aeson/TypeScript/Lookup.hs
--- a/src/Data/Aeson/TypeScript/Lookup.hs
+++ b/src/Data/Aeson/TypeScript/Lookup.hs
@@ -30,7 +30,7 @@
       interfaceDecl <- getClosedTypeFamilyInterfaceDecl name eqns
       return [FunD (mkName declNameStr) [Clause [] (NormalB (ListE [interfaceDecl])) []]]
 
-    _ -> fail [i|Expected a close type family; got #{info}|]
+    _ -> fail [i|Expected a closed type family; got #{info}|]
 
 getClosedTypeFamilyInterfaceDecl :: Name -> [TySynEqn] -> Q Exp
 getClosedTypeFamilyInterfaceDecl name eqns = do
@@ -44,7 +44,7 @@
     TySynEqn [ConT arg] result -> do
       [| TSField False (getTypeScriptType (Proxy :: Proxy $(conT arg))) (getTypeScriptType (Proxy :: Proxy $(return result))) Nothing |]
 #endif
-    x -> fail [i|aeson-typescript doesn't know yet how to handle this type family equation: '#{x}'|]
+    x -> fail [i|aeson-typescript doesn't know yet how to handle this type family equation when generating interface declaration: '#{x}'|]
 
   [| TSInterfaceDeclaration $(TH.stringE $ nameBase name) [] (L.sortBy (compare `on` fieldName) $(listE $ fmap return fields)) Nothing |]
 
@@ -56,4 +56,4 @@
 #else
     TySynEqn [ConT _] result -> return result
 #endif
-    x -> fail [i|aeson-typescript doesn't know yet how to handle this type family equation: '#{x}'|]
+    x -> fail [i|aeson-typescript doesn't know yet how to handle this type family equation when calculating closed type family image: '#{x}'|]
