在 Immutable.js 中,类型“字符串”不可分配给 keyof
Posted
技术标签:
【中文标题】在 Immutable.js 中,类型“字符串”不可分配给 keyof【英文标题】:Type 'string' is not assignable to type keyof in Immutable.js 【发布时间】:2021-12-17 09:49:41 【问题描述】:我在尝试使用来自 fromJS
函数的不可变 js reviver 时遇到此输入错误。
检查这个TS playground,我可以在那里复制它。
interface User
name: string;
age: number;
// Taken from typing definition of Immutable.js with some modification to simplify it
// https://github.com/immutable-js/immutable-js/blob/main/type-definitions/immutable.d.ts#L4955
function fromJS(
jsValue: unknown,
reviver?: (
key: string | number,
value: ''
) => unknown
): unknown
return '';
;
// My custom function for reviver,
// I used `Extract` to ensure that it gets the string only
export function modelReviver<T>(mapper: Partial<T>): (key: Extract<keyof T, string>, value: any) => any
return (key, value) => (mapper.hasOwnProperty(key) ? mapper[key] : fromJS(value));
const model = modelReviver<User>(
name: 'thomas'
);
fromJS(, model) // typing error
说的错误
Types of parameters 'key' and 'key' are incompatible.
Type 'string | number' is not assignable to type 'keyof User'.
Type 'string' is not assignable to type 'keyof User'
我知道问题出在key
参数上,因为key
来自Immutable.js,所以我不能只修改它。想知道为什么我在modelReviver
上指定的Extract
无法解决问题。 ????
有人知道为什么会这样吗?谢谢
【问题讨论】:
【参考方案1】:如果无法将泛型传递给 fromJS
,唯一的方法是键入预期的密钥 string | number
。
下面是一个示例:
interface User
name: string;
age: number;
function fromJS(
jsValue: unknown,
reviver?: (
key: string | number,
value: ''
) => unknown
): unknown
return '';
;
export function modelReviver<T>(mapper: Partial<T>): (key: string | number, value: any) => any
return (key, value) => (mapper.hasOwnProperty(key) ? mapper[key as keyof T] : fromJS(value));
const model = modelReviver<User>(
name: 'thomas'
);
fromJS(, model)
【讨论】:
谢谢你,伙计!它有效。【参考方案2】:不确定这是否会破坏您的任何功能,因为我几乎没有关于您正在尝试做什么的上下文。但是你可以通过说你想要 fromJS 中的用户键来摆脱错误,如下所示:
function fromJS(
jsValue: unknown,
reviver?: (
key: keyof User,
value: ''
) => unknown
): unknown
return '';
;
您也可以在此基础上使用 keyof T 来扩展 fromJS 的通用性。
您面临的问题来自字符串无法分配给 keyof User,因为 keyof User 比字符串更具体。
【讨论】:
谢谢丹尼尔。感谢你的帮助。在这种情况下,我无法更改fromJS
的定义。它来自在这里输入定义github.com/immutable-js/immutable-js/blob/main/type-definitions/…以上是关于在 Immutable.js 中,类型“字符串”不可分配给 keyof的主要内容,如果未能解决你的问题,请参考以下文章
使用 immutable.js 和 Facebook 流进行静态类型检查
在 Immutable.js 中使用 React 的不可变助手
在对象中设置值时 Redux 数据不重新呈现(Immutable.js)