2016-11-16 89 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(即在任何合理类型检查器下允许的)。相反,这将是主要问题。事实上,你的原始代码在它自己的工作上很好。