【问题标题】:Types of property X are incompatible属性 X 的类型不兼容
【发布时间】:2018-07-13 07:03:05
【问题描述】:

我刚刚开始使用 Typescript,并且遇到了一个奇怪的问题。

我已经声明了一个这样的接口:

Location.d.ts

interface Location {
    lat: number;
    lng: number;
}

然后这样使用这个接口:

reducer.tsx

interface MapState extends State {
    locations: Location[];
}

现在,我尝试声明一个类型为 MapState 的变量,但出现错误:

Type ... 不可分配给类型“MapState”。属性“位置”的类型不兼容。类型 ... 不可分配给类型“位置 []”。类型 ... 不可分配给类型“位置”。类型中缺少属性“哈希”...

这是我的声明:

const initialState: MapState = {
    locations: [
        { lat: 33.488069, lng: -112.072972 }
    ]
};

如果我明确地转换 Location,那么它可以工作:

const initialState: MapState = {
    locations: [
        ({ lat: 33.488069, lng: -112.072972 } as Location)
    ]
};

但这非常冗长。我在这里遗漏了什么吗?

【问题讨论】:

    标签: typescript interface


    【解决方案1】:

    类型中缺少属性“哈希”

    这意味着发生错误的地方Location不是你的Location类型——它是dom.d.ts中定义的浏览器位置对象的类型

    您可能没有在该文件 (reducer.tsx) 中导入您的 Location 类型,或者编译器没有看到它的其他原因。

    【讨论】:

    • 你说得对,我没有导入类型。它是在.d.ts 文件中定义的,所以我假设它是由 TS 导入的。我不知道 Location 已经是 TS 中的一种类型。谢谢,我会将界面重命名为独特的名称。
    • 如果Location.d.ts文件中导出,则必须导入;如果它被声明为全局类型,则必须以某种方式将 .d.ts 包含在编译中,无论是在 tsconfig.json 还是使用 reference directive
    • 另外,我真的觉得 TS 应该警告我我正在尝试覆盖现有的类..
    • 好吧,该警告将与名为 "declaration merging" 的功能冲突,该功能允许您将属性添加到在别处定义的类型
    • 语言设计目标之一是允许对现有 javacsript 代码进行类型检查,因此它必须模拟现实世界的 javascript 实践,在这种实践中,许多人会毫不犹豫地将自己的属性添加到从其他地方收到的对象中. TypeScript 可以很好地应对 IMO,你只需要准备好不时处理类似的错误。
    猜你喜欢
    • 1970-01-01
    • 2021-12-06
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 2019-02-20
    • 2018-11-21
    相关资源
    最近更新 更多