想象一下我想添加类型的这个JS函数示例:
const remap = (obj) => {
const mapped = {};
Object.keys(obj).forEach((key) => {
mapped[key] = !!key;
});
return mapped;
};
我正在try add types via a generic (in this TS playground),但我不断遇到这个错误:
Type 'Mapped<T>' is generic and can only be indexed for reading.(2862)
type Mapped<T> = {
[K in keyof T]?: boolean;
};
const remap = <T extends Record<string, unknown>>(
obj: T
) => {
const mapped: Mapped<T> = {};
Object.keys(obj).forEach((key) => {
mapped[key] = !!key; // Type 'Mapped<T>' is generic and can only be indexed for reading.(2862)
});
return mapped;
};
我想了解为什么TS不允许我写这个通用类型的对象,以及是否还有其他方法可以解决.我希望TS能够理解mapped
的类型并允许我写它,但它不会.
返回时使用as
是让TS接受这个的唯一方法吗?
const remapWithAs = <T extends Record<string, unknown>>(
obj: T
) => {
const mapped: Record<string, boolean> = {};
Object.keys(obj).forEach((key) => {
mapped[key] = !!key;
});
return mapped as Mapped<T>; // Is this my only option?
};