2016-11-16 90 views
0

我有一個字符串字面型後衛打字稿 - 字符串字面型,將字符串

type Status = 'new' | 'update' | 'close'; 

itemRequest(status: Status) { 
    itemService.subscribeToChanges(status) //third party library method 
} 

難我有一個方法是這樣的第三方方法接受字符串不是我的自定義字符串類型Status

subscribeToChanges(status: string) 

如何讓我的字符串文字實際上是字符串的類型,以及何時傳遞給第三方方法。它理解它實際上是一個字符串?

+1

究竟是什麼問題?通過'status'時你會遇到編譯錯誤?什麼錯誤?我無法重現它。 –

回答

0

你可以使Status成爲一個枚舉嗎?然後你可以使用Status[status]這將是你期望的字符串值。 即

enum Status { new, update, close } 

itemRequest(status: Status) { 
    itemService.subscribeToChanges(Status[status]) //third party library method 
} 
0

它應該工作。在JavaScript中它是一個普通的字符串。查看此示例或訪問它in the playground

// TypeScript 
type Status = 'new' | 'update' | 'close'; 

function itemRequest(status: Status) { 
    itemService.subscribeToChanges(status) //third party library method 
} 
let myStatus: Status = 'update'; 
itemRequest(myStatus); 

// Compiled JavaScript 
function itemRequest(status) { 
    itemService.subscribeToChanges(status); //third party library method 
} 
var myStatus = 'update'; 
itemRequest(myStatus); 
0

您可以在您的Status的值轉換爲一個字符串,像這樣:

type Status = 'new' | 'update' | 'close'; 

itemRequest(status: Status) { 
    itemService.subscribeToChanges(status as String) 
} 

使用String(status)。這從status構造了一個新的String對象,並且是浪費的分配。演員陣容將在運行時被刪除,並修正TypeScript關於status變量類型的知識。請記住,TypeScript所做的任何類型檢查都是在編譯時完成的,並且沒有運行時成本或存在。

此代碼將被編譯爲以下幾點:

itemRequest(status) { 
    itemService.subscribeToChanges(status) 
} 

不過,我爲什麼這是發生混亂。您的類型別名均爲String,因此從StatusString的投射應該是upcast(即在任何合理類型檢查器下允許的)。相反,這將是主要問題。事實上,你的原始代碼在它自己的工作上很好。