在 Typescript 中输入 Immutable.js 地图
Typing Immutable.js Map in Typescript
我是 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>
只允许使用 keyof DataType
类型的参数调用 get()
。所以你得到一个错误。
也许你的意思是 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;
}
这应该会如您所愿。祝你好运!
我是 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>
只允许使用 keyof DataType
类型的参数调用 get()
。所以你得到一个错误。
也许你的意思是 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;
}
这应该会如您所愿。祝你好运!