简体   繁体   English

在Typescript中键入Immutable.js映射

[英]Typing Immutable.js Map in Typescript

I'm a newbie in Typescript and i'm trying to strongly type an Immutable Map (immutable.js library). 我是Typescript的新手,并且我正试图大力键入Immutable Map(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;

and I have this error. 我有这个错误。

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> {
                    ~~~~~~~~

How can I solve it? 我该如何解决?

The error is correct... Your TypedMap<DataType> does not act like a Map<string, AllowedValue> . 错误是正确的...您的TypedMap<DataType>Map<string, AllowedValue>不一样。 If I have a Map<string, AllowedValue> , I should be able to call get("randomString") on it. 如果我有Map<string, AllowedValue> ,则应该可以在其上调用get("randomString") But TypedMap<DataType> only allows get() to be called with a parameter of type keyof DataType . 但是TypedMap<DataType>仅允许使用keyof DataType的参数调用get() So you get an error. 所以你得到一个错误。

Perhaps you meant that TypedMap<DataType> should act like a Map<keyof DataType, AllowedValue> instead? 也许您是说TypedMap<DataType>应该像Map<keyof DataType, AllowedValue>一样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;

}

That should hopefully act the way you want. 希望可以按照您想要的方式进行操作。 Good luck! 祝好运!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM