2016-11-08 46 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); 
    } 
} 

我不會在這兩條線的理解:

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

SqliteLoggerImpl構造函數需要一個IRepository ,我已經給了它。 LoggerServiceImpl構造函數需要一個ILogger,我已經給它了。

爲什麼我仍然看到這個,「[ts]提供的參數不匹配呼叫目標的任何簽名」?

+1

new SqliteRepositoryImpl();這個班在哪裏? –

+0

你必須聲明'constructor(sqliteRepo:IRepository )'而不是'SqliteLoggerImpl(sqliteRepo:IRepository ){'無處不在。 – yurzui

+0

@yurzui,你發現了,非常感謝。 這是正確的答案。 – MALINKA

回答

1

TypeScript與其他語言不同,其中構造函數是類的名稱。您需要使用關鍵字constructor。你在所有的實現中所擁有的僅僅是該類中與該類相同名稱的一種方法。此方法是而不是使用new時稱爲什麼。這是constructor。當我們沒有定義一個類時,每個類都有一個默認的無參數構造函數。因此,當您嘗試執行new Something(someArg)時,這會失敗,因爲默認的無參數構造函數不帶參數。所以只需將所有「假設的構造函數」更改爲constructor s

+0

感謝peeskillet,這是正確的答案:-D 我希望我能爲這個答案投票。 – MALINKA