打字稿+ keyof。声明对象转换

Typescript + keyof. Declaring an object transformation

我正在尝试理解 keyof。

我想描述一个接收对象 { a : 1, b : 'anything'} 并且应该 return 类似 { a: true , b: false } 的函数(相同的键,但始终是布尔值)。

但是当我写(例子)

function fn<K>(obj:K) : { [param:keyof K] : boolean } { /* ... */ }

... TS 说我 param 必须是字符串或数字。

这是有道理的,因为 K 可以是地图。我怎样才能避免这个错误?我怎么能声明 K 是一个普通的 JS 对象(所以它的键总是字符串)? K extends {} 不起作用。

应该是:

function fn<K>(obj: K): { [P in keyof K]: boolean } { /* ... */ }

如图mapped types section of the keyof feature.