TS2559:字符串类型与对象类型没有共同的属性

问题描述 投票:0回答:1

在打字稿中,我定义了一个映射,如下所示,我想接受(字符串,任何内容)的(键,值)对。

let map= new Map<String, Object>()

当我尝试使用如下代码将(键,值)对插入地图时:

map.set("name", "someName");

我收到此错误

TS2559: Type  string  has no properties in common with type  Object
。我猜这里的 String 不是从 Object 继承的。

在打字稿中执行此操作的最佳方法是什么?

这在 Java 中会通过。

typescript dictionary inheritance
1个回答
0
投票

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
有以下成员:

  • 数字的索引签名,类似于Java中的
    charAt(int)
    方法,
  • Symbol.iterator
    ,与 Java 中
    CharSequence
    codePoint
    方法基本相同,
  • 以及由
    string
    s
  • 命名的各种方法

TypeScript 正在进行“结构类型”,这与 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
来修复它。

© www.soinside.com 2019 - 2024. All rights reserved.