首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >{ [ string ]:string}和{ [string]:(string Are }不兼容吗?

{ [ string ]:string}和{ [string]:(string Are }不兼容吗?
EN

Stack Overflow用户
提问于 2022-11-10 10:14:22
回答 1查看 19关注 0票数 1

stringstring | number是兼容的,但是{ [string]: string }{ [string]: (string | number} }是不兼容的。

我做错什么了吗?

https://flow.org/try/#0PQKgBAAgZgNg9gdzCYAoVAXAngBwKZgAqAjGALxgDOGATgJYB2A5gNya4GEBM5VtjTMAB8wDAK4BbAEZ4abbPiIBmXgG8wAbWr1mAXQBcfHYIC+8jkQAsazdoEGiPE+ihiGAYwx04DMBICGjAAUAJSqqGBgAG7+NNHEhiS8AORQcHDJbJExcVFciTwUUcRsEdGx0UqJKhTqUrGGyfU0yWBmZTnRlonWRUpszkA

代码语言:javascript
复制
/* @flow */

type T1 = string;
type T2 = string | number;
type T3 = { [string]: string };
type T4 = { [string]: T2 }

function main(){
  var v1: T1 = 'foo';
  var v2: T2 = v1;

  var v3: T3 = { bar: 'bar' };
  var v4: T4 = v3;
}
代码语言:javascript
复制
13:   var v4: T4 = v3;
                   ^ Cannot assign `v3` to `v4` because string [1] is incompatible with number [2] in the indexer property. [incompatible-type]
References:
5: type T3 = { [string]: string };
                         ^ [1]
6: type T4 = { [string]: T2 }
                         ^ [2]
EN

回答 1

Stack Overflow用户

发布于 2022-11-11 11:09:57

原因

这是正常和预期的。

如果这是允许的,那么你将被允许去做

代码语言:javascript
复制
 v4.foo = 1;
 var expectAString : string = v3.foo;

你会得到一个数字,即使由于v3的类型,你应该只有一个字符串。

解决方案

将对象标记为只读:

代码语言:javascript
复制
type T3 = $ReadOnly<{ [string]: string }>;
type T4 = $ReadOnly<{ [string]: T2 }>;

流试链路

因为它们是只读的,这就阻止了您实际执行v4.foo = 1;

备注

数组的情况与此相同,请参见这个答案

文档

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

https://stackoverflow.com/questions/74387333

复制
相关文章

相似问题

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