在打字稿中,我定义了一个映射,如下所示,我想接受(字符串,任何内容)的(键,值)对。
let map= new Map<String, Object>()
当我尝试使用如下代码将(键,值)对插入地图时:
map.set("name", "someName");
我收到此错误
TS2559: Type string has no properties in common with type Object
。我猜这里的 String 不是从 Object 继承的。
在打字稿中执行此操作的最佳方法是什么?
这在 Java 中会通过。
String
和Object
类型引用“堆”上的值,这与Java相同。
然而,在 TypeScript 中,字符串文字的类型是 string
。 String
指的是对象,string
指的是“原始值”。如需了解更多信息,MDN 发布了详细文章。
Object
定义如下(您可能不理解它的签名,但不用担心 - 这不相关):
interface Object {
constructor: Function;
toString(): string;
toLocaleString(): string;
valueOf(): Object;
hasOwnProperty(v: PropertyKey): boolean;
isPrototypeOf(v: Object): boolean;
propertyIsEnumerable(v: PropertyKey): boolean;
}
(我假设你熟悉Java的
interface
,所以我会省略interface
是什么)
另一方面,
string
有以下成员:
charAt(int)
方法,Symbol.iterator
,与 Java 中 CharSequence
的 codePoint
方法基本相同,string
sTypeScript 正在进行“结构类型”,这与 Java 不同(Java 的类型系统是“名义类型”)。 这些类型系统之间的主要区别在于结构类型根据类型的属性来判断子类型。换句话说,在 TypeScript 看来,
Hello
和 Hi
与 Java 不同:
interface Hello {}
interface Hi {}
const hello: Hello = {};
// no compile errors
const hi: Hi = hello;
TypeScript 查看属性的交集来测试该值是否可分配和/或能够传递。但是,
Object
和string
根本没有共同财产! TypeScript 抱怨它表明它不是你可能不想要的。
您可以按照其他用户的建议将
String
更改为 string
来修复它。