2016-11-08 7 views
1

sqliteのロガーを実装しようとしています。コンストラクタに手動で注入するとエラーが発生する

ilogger.ts

export interface ILogger { 
    write (log: Log): any; 
} 

ilogger.service.ts

export interface ILoggerService { 
    info(log: Log): any; 
    error(log: Log): any; 
} 

irepository.ts

export interface IRepository<T> { 
    find(key: number): any; 
    insert(data: T): any; 
    remove(key: number): any; 
    fetch(count: number, skip: number): any; 
} 

sqlite.logger.impl.ts

export class SqliteLoggerImpl implements ILogger { 

    sqliteRepo: IRepository<Log>; 

    SqliteLoggerImpl(sqliteRepo: IRepository<Log>) { 
     this.sqliteRepo = sqliteRepo; 
    } 

    write(log: Log): any { 
     return this.sqliteRepo.insert(log); 
    } 
} 

logger.service.impl.ts

export class LoggerServiceImpl implements ILoggerService { 
    logger: ILogger; 

    LoggerServiceImpl(logger: ILogger) { 
     this.logger = logger; 
    } 

    info(log: Log): any { 
     log.severity = 0; 
     return this.logger.write(log); 
    } 

    error(log: Log): any { 
     log.severity = 1; 
     return this.logger.write(log); 
    } 
} 

app.component.ts

@Component({ 
    selector: "my-app", 
    templateUrl: "app.component.html" 
}) 
export class AppComponent { 
    logs: Array<Log>; 
    loggerService: ILoggerService; 

    constructor() { 
     let repo: IRepository<Log> = new SqliteRepositoryImpl(); 

     // [ts] Supplied parameters do not match any signature of call target 
     let logger: ILogger = new SqliteLoggerImpl(repo); 
     this.loggerService = new LoggerServiceImpl(logger); 
    } 
} 

私は、次の2行では理解していない:

let logger: ILogger = new SqliteLoggerImpl(repo); 
this.loggerService = new LoggerServiceImpl(logger); 

SqliteLoggerImplコンストラクタはIRepositoryを必要とします、私はすでにそれを与える。 LoggerServiceImplコンストラクタにはILoggerが必要ですが、私はすでにそれを与えています。

なぜこのように表示されるのですか、「[ts]指定されたパラメータは呼び出し対象のシグネチャと一致しません」。

+1

新しいSqliteRepositoryImpl();このクラスはどこですか? –

+0

'SqliteLoggerImpl(sqliteRepo:IRepository ){'どこでもコンストラクタ(sqliteRepo:IRepository ) 'のようなコンストラクタを宣言する必要があります。 – yurzui

+0

@yurzui、あなたはそれを捕まえました、ありがとうございました。 これは正解です。 – MALINKA

答えて

1

TypeScriptは、コンストラクタがクラスの名前である他の言語と似ていません。キーワードconstructorを使用する必要があります。すべての実装であなたが持っているものは、そのクラスの同じ名前のクラス内の単なるメソッドです。この方法はではなくで、newを使用すると呼び出されます。それはconstructorです。そして、すべてのクラスには、デフォルトの引数なしのコンストラクタが定義されています。したがって、new Something(someArg)を実行しようとすると、デフォルトの引数なしコンストラクタが引数をとらないので、これは失敗します。だからあなたのすべての "想定コンストラクタ"をconstructorに変更してください。

+0

peeskilletありがとうございます、これは正解です:-D 私はこの回答に投票することができますしたいと思います。 – MALINKA

関連する問題