TS2339: свойство 'x' не существует для типа 'Y'. В классе наследования

Допустим, у меня есть иерархия классов примерно так:

// 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 должен иметь возможность использовать функциональность DI из Angular при регистрации провайдеров. Я не могу использовать интерфейс из-за очевидного ограничения с интерфейсами машинописи и JavaScript. Я не могу использовать AbstractModel ни потому, что это было бы слишком общим.

  • monorepo хранилище обрабатывается с помощью lerna

  • Не было синтаксической ошибки. Точки были просто способом заявить, что это было object заполнитель, в реальном коде есть правильно определенный хеш объекта.

Эта проблема, как обычно, была связана с неправильным пониманием того, что происходило под капотом. Я опубликую результаты как ответ, чтобы придерживаться способов переполнения стека.

Заранее спасибо.

2 ответа

Я сожалею, что не определил правильно (полностью) сценарий. В этом случае моя промежуточная модель реализации Model также реализует некоторые другие интерфейсы, давайте назовем это ModelInterface и использование в коде было именно с использованием этого типа, поэтому вместо этого:

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

У меня было это:

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

И конечно ModelInterface имеет другое определение, не содержащее assignFromHash() метод. Вот почему машинопись не имела способа разрешить метод из заданного типа.

Так что еще раз спасибо за заботу и извинения за использованное время.

ура

Ваш представленный код компилируется без ошибок:

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
});

демонстрация

введите описание изображения здесь

Больше

Если вам удастся воспроизвести ошибку снова, пожалуйста, откройте новый вопрос.

Другие вопросы по тегам