【问题标题】:TS2339: Property 'x' does not exist on type 'Y'. In class inheritanceTS2339:类型“Y”上不存在属性“x”。在类继承
【发布时间】:2017-11-13 13:55:12
【问题描述】:

假设我有一个像这样的类层次结构:

// monorepo/src/package1/file1.ts
export class AbstractModel implements Hashable {

    assignFromHash(hash: Object): void {
        Object.assign(this, hash);
    }
}

// monorepo/src/package2/file2.ts
export abstract class Model extends AbstractModel {}

// monorepo/src/package2/file3.ts
export class ModelImpl extends Model {}

// monorepo/src/application/file4.ts somewhere in application.
// Here object `model`, because of the angular DI setup,
// is an instance of ModelImpl
(model: Model ) => {
    model.assignFromHash({});
}

使用tsc -p . 和以下tsconfig.json 编译时:

{
  "compilerOptions": {
  "allowSyntheticDefaultImports": true,
  "declaration": false,
  "emitDecoratorMetadata": true,
  "experimentalDecorators": true,
  "skipLibCheck": true,
  "noStrictGenericChecks": true,
  "lib": [
    "dom",
    "es2015"
  ],
  "module": "es2015",
  "moduleResolution": "node",
  "sourceMap": true,
  "target": "es5"
},
"include": [
  "./**/*.ts"
],
"exclude": [
  "node_modules"
],
"compileOnSave": false,
"atom": {
  "rewriteTsconfig": false
}

}

我得到:

error TS2339: Property 'assignFromHash' does not exist on type 'Model'.

我错过了什么?如何解决这个问题?

注意:

  • 拥有中间类Model 的原因是能够在registering providers 时使用Angular 的DI 功能。由于 typescript 接口和 javascript 的明显限制,我无法使用接口。我也不能使用AbstractModel,因为那样太笼统了。

  • monorepo 存储库由 lerna 处理

  • 没有语法错误。点只是说明它是object 占位符的一种方式,真正的代码有一个正确定义的对象哈希。

像往常一样,这个问题是由于对幕后发生的事情的错误理解造成的。为了坚持堆栈溢出方式,我将发布结果作为答案。

提前致谢。

【问题讨论】:

    标签: angular typescript ionic2 class-hierarchy


    【解决方案1】:

    您提供的代码编译没有错误:

    export interface Hashable { }
    export class AbstractModel implements Hashable {
      assignFromHash(hash: Object): void {
        Object.assign(this, hash);
      }
    }
    export abstract class Model extends AbstractModel { }
    export class ModelImpl extends Model { }
    console.log((model: Model) => {
      model.assignFromHash({}); // No error
    });
    

    演示

    更多

    如果您设法再次重现错误,请打开一个新问题。

    【讨论】:

    • 嗨@basarat,我只是编辑我的问题并发布了真正的错误是什么。感谢您查看此内容。
    【解决方案2】:

    很抱歉,我没有正确(完全)定义场景。在这种情况下,我的中间实现模型Model 还实现了一些其他接口,我们称之为ModelInterface,代码中的用法正是使用这种类型,所以改为:

    (model: Model ) => {
        model.assignFromHash({});
    }
    

    我有这个:

    (model: ModelInterface ) => {
        model.assignFromHash({});
    }
    

    当然ModelInterface 有其他定义,不包含assignFromHash() 方法。这就是打字稿无法从给定类型解析方法的原因。

    再次感谢您的照顾,并为所用的时间道歉。

    干杯

    【讨论】:

      猜你喜欢
      • 2016-11-14
      • 2019-01-11
      • 2020-03-26
      • 2021-12-15
      • 2016-03-14
      • 2017-02-25
      相关资源
      最近更新 更多