Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 嵌套类型脚本映射类型_Typescript_Generics_Union Types - Fatal编程技术网

Typescript 嵌套类型脚本映射类型

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'}]

使用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'}]
])
台糖呕吐

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}
,这是一种不同的类型。