2016-04-07 68 views
0

我在尋找一點清晰度。我有一個打字稿(我使用的是1.7),它綁在選擇選項的變化事件功能的HTML /下拉:爲什麼定義類型的函數參數不執行轉換

toggleWorker(stsID: number): void { 
    // get status object by selected staus ID 
    let cStatus: Status = this.stsList.filter((s: Status) => s.StatusID === stsID)[0]; 
    // if status requires a worker to be assigned then toggle requireWorker 
    if (cStatus.RequireWorker) { 
     this.requireWorker = true; 
    } else if (!cStatus.RequireWorker) { 
     this.requireWorker = false; 
    } 
} 

這裏是HTML聲明:

<div class="large-3 columns"> 
     <label >Trade Status 
      <select id="StatusID" 
       [(ngModel)]="currentTrade.StatusID" 
       [ngFormControl]="shiftForm.controls['StatusID']" 
       (change)="toggleWorker($event.target.value)" > 
       <option *ngFor="#sts of stsList" value="{{sts.StatusID}}" 
        >{{sts.Title}}</option> 
      </select> 
     </label> 
    </div> 

這裏是班裏的狀態對象,所以你可以看到,StatusID是一種編號:

export class Status { 

StatusID: number; 
PortalID: number; 
Title: string; 
Code: string; 
RequireWorker: boolean; 

constructor(obj?: any) { 
    this.StatusID = obj && obj.StatusID || 0; 
    this.PortalID = obj && obj.PortalID || 0; 
    this.Title = obj && obj.Title || null; 
    this.Code = obj && obj.Code || null; 
    this.RequireWorker = obj && obj.RequireWorker || false; 
} 

}

我有一個sample fiddle這裏完美的作品。

但是,當我試圖在我的angular2應用程序中使用它,它不工作,除非我明確轉換函數參數的類型。請參閱以下變化:

let cStatus: Status = this.stsList.filter((s: Status) => s.StatusID === Number(stsID))[0]; 

公告加入數(stsID)

問題: 有人可以幫助我理解這是怎麼回事。是函數參數的類型聲明僅用於內部類型檢查,我認爲它會執行到該類型的轉換。

我希望這是有道理的。

謝謝

回答

1

正如你所假設的類型只適用於靜態類型檢查。沒有轉換正在進行。你需要明確地轉換。

也有type casting你表達的類型檢查可以假定一個值是某種類型,但如果它實際上不是那種類型也不會轉換值。

+0

謝謝,那麼在這種情況下類型轉換的最佳做法是什麼?您是否嘗試將函數參數作爲函數的第一步轉換爲所有參數? –

+1

我想我會創建一個像http://stackoverflow.com/questions/31879497/angular2-radio-button-binding中顯示的自定義ControlValueAccessor或執行轉換的getter/setter。 –

相關問題