javascript - 在 Typescript 中输入 Immutable.js Map

标签 javascript typescript types immutable.js

我是 Typescript 的新手,我正在尝试强类型不可变映射(immutable.js 库)。

type AllowedValue =
    string |
    number |
    boolean |
    AllowedMap |
    AllowedList |
    TypedMap<any> |
    undefined;

interface AllowedList extends List<AllowedValue> {}

interface AllowedMap extends Map<string, AllowedValue> {}

export type MapTypeAllowedData<DataType> = {
    [K in keyof DataType]: AllowedValue;

};

export interface TypedMap<DataType extends MapTypeAllowedData<DataType>> extends Map<string, AllowedValue> {
    toJS(): DataType;
    get<K extends keyof DataType>(key: K, notSetValue?: DataType[K]): DataType[K];
    set<K extends keyof DataType>(key: K, value: DataType[K]): this;

}

const createTypedMap = <DataType extends MapTypeAllowedData<DataType>>(data: DataType): TypedMap<DataType> => Map(data) as any;

我有这个错误。

Interface 'TypedMap<DataType>' incorrectly extends interface 'Map<string, AllowedValue>'.
  Types of property 'set' are incompatible.
    Type '<K extends keyof DataType>(key: K, value: DataType[K]) => this' is not assignable to type '(key: string, value: AllowedValue) => this'.
      Types of parameters 'key' and 'key' are incompatible.
        Type 'string' is not assignable to type 'keyof DataType'.
export interface TypedMap<DataType extends MapTypeAllowedData<DataType>> 
extends Map<string, AllowedValue> {
                    ~~~~~~~~

如何解决?

最佳答案

错误是正确的...您的TypedMap<DataType>不像 Map<string, AllowedValue> 。如果我有一个Map<string, AllowedValue> ,我应该可以调用 get("randomString")在上面。但是TypedMap<DataType>只允许get()使用 keyof DataType 类型的参数调用。所以你会得到一个错误。

也许你的意思是TypedMap<DataType>应该像Map<keyof DataType, AllowedValue>一样相反?

export interface TypedMap<DataType extends MapTypeAllowedData<DataType>>
  extends Map<keyof DataType, AllowedValue> { // changed here

  toJS(): DataType;
  get<K extends keyof DataType>(key: K, notSetValue?: DataType[K]): DataType[K];
  set<K extends keyof DataType>(key: K, value: DataType[K]): this;

}

这应该会按照你想要的方式进行。祝你好运!

关于javascript - 在 Typescript 中输入 Immutable.js Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56393769/

相关文章:

javascript - 访问 Node 中的构造函数变量。 js

javascript - 任意定位显示的动画移动 :inline elements into a position:relative final position

javascript - 检测浏览器中已安装的扩展?

javascript - TypeScript 简单写下 "if"

javascript - 是否可以声明一个适用于数字和大整数的 typescript 函数?

JavaScript 不工作?随机发生器代码

javascript - 带有 Webpack 的 Typescript 中的环境变量

typescript - 我如何编写一个将可变或不可变数组作为参数的通用 TypeScript 函数

Python:如何在 if 语句中使用类型函数?

types - 如何在没有赋值的情况下注释 Rust 变量的数据类型?