我的源类型定义为:
unit: 'hour'|'day'|'week'|'month'
我将它用作小写的moment.js库。 Bu我还需要将其大写用作后端端点。所以我的http方法接受参数为
unit: 'HOUR'|'DAY'|'WEEK'|'MONTH'
但是打字稿不接受方法调用中通过toUpperCase进行的转换。
类型'string'的参数不能分配给类型'HOUR'|'DAY'|'WEEK'|'MONTH'的参数
打字稿中是否有一个优雅的解决方案,我不会破坏静态类型检查,同时又不会提供额外的转换器辅助函数(自定义toUpperCase)?
感谢您的建议! :)
答案 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'
}
}