首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建类型映射?

如何创建类型映射?
EN

Stack Overflow用户
提问于 2018-01-21 03:49:08
回答 1查看 33关注 0票数 1

例如,如果我有一些这样的代码来处理距离:

kilo(a: mm): m kilo(a: m): km unkilo(b: km): m unkilo(b: m): mm

我想把它扩展到包括大多数SI前缀(pico,nano,micro,milli,(normal),kilo,mega,等等)。

这需要大量的typescript代码来完成。

有没有可能创建某种映射,使我只有2行。

kilo (a: T): (lookup T in map) unkilo (b: T): (reverse lookup T in map)

EN

回答 1

Stack Overflow用户

发布于 2018-01-21 04:16:04

我不确定你的类型是如何定义的,但我会假设它们是这样的:

代码语言:javascript
复制
type mm = number & { "**type**": "mm" }
type m = number & { "**type**": "m" }
type km = number & { "**type**": "km" }

这可能是表示它们的最轻量级的方式:只在运行时使用数字。或者,您可能希望它们成为功能齐全的对象。

重要的是,它们之间有一个共同的属性(在本例中为"**type**"),它们具有不同的字符串字面值("mm""m""km")。然后你可以这样做:

代码语言:javascript
复制
interface KiloMap {
  mm: m
  m: km
}
interface UnkiloMap {
  m: mm
  km: m
}

它表示您想要的映射。TypeScript擅长将字符串文字映射到常规类型(实际上,这就是接口),但不太擅长将常规类型映射到常规类型(至少在没有建议的extended typeof特性的情况下不是这样)。

最后,您可以编写您的函数类型:

代码语言:javascript
复制
function kilo<T extends (m | mm)>(a: T): KiloMap[T["**type**"]] {
  return a / 1000 as any;
}
function unkilo<T extends (km | m)>(a: T): UnkiloMap[T["**type**"]] {
  return a * 1000 as any;
}

并验证它们是否按预期工作:

代码语言:javascript
复制
const oneMeter = 1 as m;
const oneThousandthOfAKilometer = kilo(oneMeter); // km
const oneThousandMillimeters = unkilo(oneMeter); // mm

您可以根据需要添加新的类型/映射/函数。希望这能有所帮助;祝你好运!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48360413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档