type A = {[x:string]:string}
type B = keyof A // string | number
// ^?
const A:A = {a:"abc",[1]:"xyz"}
type C = keyof A & string // string
// ^?
playground
обычно это не вызывает никаких проблем, потому что числовой ключ в javascript будет преобразован в строковый.
Однако это может вызвать проблему, если мы делаем некоторые манипуляции с типами.
Чтобы решить эту проблему, мы можем пересечь его со строкой или установить keyofStringsOnly
в true в конфигурации ts
или просто использовать Record<string, T>
/ {[x in string]: T}
это работает как ожидалось
подробнее на github PR и в примечании к релизу