不接受 Typescript toUpperCase() 转换

Luc*_*oke 5 typescript

我将源类型定义为:

unit: 'hour'|'day'|'week'|'month'
Run Code Online (Sandbox Code Playgroud)

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

unit: 'HOUR'|'DAY'|'WEEK'|'MONTH'
Run Code Online (Sandbox Code Playgroud)

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

“string”类型的参数不可分配给“HOUR”|“DAY”|“WEEK”|“MONTH”类型的参数

在此输入图像描述

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

感谢您的建议!:)

Tit*_*mir 6

您可以扩展 的声明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"
Run Code Online (Sandbox Code Playgroud)

笔记

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

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