首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在TypeScript中赋值后,对象字面量会被认为与索引映射不兼容?

为什么在TypeScript中赋值后,对象字面量会被认为与索引映射不兼容?
EN

Stack Overflow用户
提问于 2014-01-30 04:03:18
回答 1查看 89关注 0票数 1

我在TypeScript代码中遇到了一些奇怪的情况:

代码语言:javascript
复制
var a : { [name: string]: any } = { a: 'A' }; // WORKS!

interface T { [name: string]: any };
var b : T = { a: 'A' };                       // WORKS!

interface Q<a> { [name: string]: a };
var c : Q<any> = { a: 'A' };                  // WORKS!

var d = { a: 'A' };
c = d;                                        // DOESN'T WORK

有人能给我解释一下它出了什么问题吗?

代码语言:javascript
复制
Error   1   Cannot convert '{ a: string; }' to 'Q<any>':
    Index signatures of types '{ a: string; }' and 'Q<any>' are incompatible.   
EN

回答 1

Stack Overflow用户

发布于 2014-01-30 04:52:10

如果你考虑过:

代码语言:javascript
复制
var d = { a: 'A' };

d的类型可以推断为:

代码语言:javascript
复制
var d: { a : string };

对于TypeScript,若要声明两个类型相同,则当它们是索引签名时,这两个类型必须是具有相同类型的相同类型。(从规范中的3.8.2开始)

因此,这是不起作用的:

代码语言:javascript
复制
c = d;   

因为它实际上被看作是这两个类型定义:

代码语言:javascript
复制
{ [name: string] : any } = { a : string };

这些不相同(因为它们不是完全相同的索引签名)。

当您直接在强类型变量(如c)上创建和设置值时,类型是众所周知的。

如果您添加了另一个测试:

代码语言:javascript
复制
var e: { a: string } = { a: 'A'};
e = d;

您将看到e将如何在没有警告的情况下接受d的值。C= e;

其他的集合是有效的,因为您已经显式地声明了类型,所以类型被正确地推断出来了(正如您所看到的那样)。这种行为类似于另一种语言,在这种语言中,您可以使用像int这样的类型,例如:int myVar = 6;。在这种情况下,6将被视为int,即使它可以表示为byte

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21441429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档