【问题标题】:typescript - string literal type to type stringtypescript - 字符串文字类型以输入字符串
【发布时间】:2017-03-31 03:29:43
【问题描述】:

我有一个字符串文字类型保护的方法

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

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

我遇到的困难是这个第三方方法接受字符串而不是我的自定义字符串类型Status

subscribeToChanges(status: string) 

当我传递给第三方方法时,如何使我的字符串文字实际上是字符串类型。它明白它实际上是一个字符串吗?

【问题讨论】:

  • 到底是什么问题?通过 status? 时出现编译错误?什么错误?我无法重现它。

标签: javascript string typescript typeliteral


【解决方案1】:

您可以将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 类型,因此从Status 转换为string 应该是向上转换(即,在任何合理的类型检查器下都允许)。反过来,将是主要问题。事实上,您的原始代码本身就可以正常工作。

【讨论】:

【解决方案2】:

你能让 Status 成为一个枚举吗?然后您可以使用Status[status],这将是您期望的字符串值。 即

enum Status { new, update, close }

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

【讨论】:

    【解决方案3】:

    它应该工作。在 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);
    

    【讨论】:

      猜你喜欢
      • 2017-11-13
      • 2019-12-10
      • 1970-01-01
      • 2019-11-06
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      • 1970-01-01
      • 2017-08-30
      相关资源
      最近更新 更多