Typescript 嵌套类型脚本映射类型
使用Typescript 3.5.1,我似乎无法获得要编译的值的类型。有关下列事项:Typescript 嵌套类型脚本映射类型,typescript,generics,union-types,Typescript,Generics,Union Types,使用Typescript 3.5.1,我似乎无法获得要编译的值的类型。有关下列事项: type foo = 'a' | 'b' const x: Map<foo, {[key: string]: string}> = new Map([ ['a', {'ok': 'so'}], ['b', {'nah': 'right'}] ]) type foo='a'|'b' 常量x:Map=新映射([ ['a',{'ok':'so'}], ['b',{'nah':'right'}]
type foo = 'a' | 'b'
const x: Map<foo, {[key: string]: string}> = new Map([
['a', {'ok': 'so'}],
['b', {'nah': 'right'}]
])
type foo='a'|'b'
常量x:Map=新映射([
['a',{'ok':'so'}],
['b',{'nah':'right'}]
])
台糖呕吐
const x: Map<foo, {
[key: string]: string;
}>
Type 'Map<"a" | "b", { 'ok': string; 'nah'?: undefined; } | { 'nah': string; 'ok'?: undefined; }>' is not assignable to type 'Map<foo, { [key: string]: string; }>'.
Type '{ 'ok': string; 'nah'?: undefined; } | { 'nah': string; 'ok'?: undefined; }' is not assignable to type '{ [key: string]: string; }'.
Type '{ 'ok': string; 'nah'?: undefined; }' is not assignable to type '{ [key: string]: string; }'.
Property ''nah'' is incompatible with index signature.
Type 'undefined' is not assignable to type 'string'.
const x:Map
类型“Map”不可分配给类型“Map”。
类型“{'ok':string;'nah'?:未定义;}{'nah':string;'ok'?:未定义;}”不能分配给类型“{[key:string]:string;}”。
类型“{”确定“:string;'nah'?:未定义;}”不可分配给类型“{[key:string]:string;}”。
属性“nah”与索引签名不兼容。
类型“未定义”不可分配给类型“字符串”。
这是一个编译器错误,还是我做错了什么使映射的值看起来像一个联合类型
我很确定这不是一个bug。Typescript将右侧的类型缩小为
{ok:string,nah?:undefined}{ok?:undefined,nah:string}
,因为您有两个对象缺少另一个对象的属性。如果访问“nah”,只有“ok”的将返回undefined,反之亦然
这意味着初始类型{[key:string]:string}
不再有效,因为属性可以返回字符串(“so”和“right”是string的子类型)或未定义
最简单的方法是使用Map
允许这些未定义的值
编辑:更正了推断类型-感谢jcalz指出这一点 我很确定这不是一个bug。Typescript将右侧的类型缩小为
{ok:string,nah?:undefined}{ok?:undefined,nah:string}
,因为您有两个对象缺少另一个对象的属性。如果访问“nah”,只有“ok”的将返回undefined,反之亦然
这意味着初始类型{[key:string]:string}
不再有效,因为属性可以返回字符串(“so”和“right”是string的子类型)或未定义
最简单的方法是使用Map
允许这些未定义的值
编辑:更正了推断类型-感谢jcalz指出这一点 TypeScript的类型推断有时会有点混乱。它从来都不是完美的,TypeScript团队不得不做出艰难的选择。 你得到的选择与你的期望不符 您可以通过显式指定泛型类型来实现类型推断:
const x = new Map<foo, {[key: string]: string}>([
['a', {'ok': 'so'}],
['b', {'nah': 'right'}]
])
const x=新映射([
['a',{'ok':'so'}],
['b',{'nah':'right'}]
])
TypeScript的类型推断有时会有点混乱。它从来都不是完美的,TypeScript团队不得不做出艰难的选择。
你得到的选择与你的期望不符
您可以通过显式指定泛型类型来实现类型推断:
const x = new Map<foo, {[key: string]: string}>([
['a', {'ok': 'so'}],
['b', {'nah': 'right'}]
])
const x=新映射([
['a',{'ok':'so'}],
['b',{'nah':'right'}]
])
索引签名和未定义的值有点奇怪。。。在这种情况下,我建议您要么使用类型{[key:string]:string | undefined}
,要么尝试新映射
。。。但我想知道你的用例是什么。我通常使用{[k:string]:SomeType | undefined}
,因为不太可能每个可能的键都有一个值,据我所知,这可能是一个bug,可以追溯到TS2.7的时候。如果您可以扩展您的用例(您计划如何从这个映射读取/写入该映射?)我可以把这些评论变成答案。索引签名和未定义的值有点奇怪。。。在这种情况下,我建议您要么使用类型{[key:string]:string | undefined}
,要么尝试新映射
。。。但我想知道你的用例是什么。我通常使用{[k:string]:SomeType | undefined}
,因为不太可能每个可能的键都有一个值,据我所知,这可能是一个bug,可以追溯到TS2.7的时候。如果您可以扩展您的用例(您计划如何从这个映射读取/写入该映射?)我可以把这些评论变成一个答案。它并没有缩小到{ok?:“so”,nah?:“right”}
。它被推断为{ok:string,nah?:undefined}{ok?:undefined,nah:string}
,这是一种不同的类型。它没有缩小到{ok?:“so”,nah?:“right”}
。它被推断为{ok:string,nah?:undefined}{ok?:undefined,nah:string}
,这是一种不同的类型。