在 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 的不可变助手

Immutable.js 与 Angular 2

在对象中设置值时 Redux 数据不重新呈现(Immutable.js)

Immutable.js - fromJS 生成 Record 代替 Map

如何定义一定大小的数组 immutable.js