不接受Typescript的toUpperCase()转换

时间:2018-06-26 09:43:31

标签: typescript

我的源类型定义为:

unit: 'hour'|'day'|'week'|'month'

我将它用作小写的moment.js库。 Bu我还需要将其大写用作后端端点。所以我的http方法接受参数为

unit: 'HOUR'|'DAY'|'WEEK'|'MONTH'

但是打字稿不接受方法调用中通过toUpperCase进行的转换。

  

类型'string'的参数不能分配给类型'HOUR'|'DAY'|'WEEK'|'MONTH'的参数

enter image description here

打字稿中是否有一个优雅的解决方案,我不会破坏静态类型检查,同时又不会提供额外的转换器辅助函数(自定义toUpperCase)?

感谢您的建议! :)

1 个答案:

答案 0 :(得分:1)

您可以扩展toUpperCase的声明以使其具有额外的重载,该重载采用此特定的字符串文字类型联合,并返回联合类型的大写版本。没有额外的功能,只有额外的编译时声明:

interface String {
    toUpperCase(this: 'hour'|'day'|'week'|'month') : 'HOUR'|'DAY'|'WEEK'|'MONTH'
}

declare let low: 'hour'|'day'|'week'|'month';
let up = low.toUpperCase(); // typed as "HOUR" | "DAY" | "WEEK" | "MONTH"

注意

如果您在模块中,则需要在全局名称空间中重新声明字符串:

declare global {
    interface String {
        toUpperCase(this: 'hour' | 'day' | 'week' | 'month'): 'HOUR' | 'DAY' | 'WEEK' | 'MONTH'
    }
}