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
});
демонстрация
Больше
Если вам удастся воспроизвести ошибку снова, пожалуйста, откройте новый вопрос.