例如,如果我有一些这样的代码来处理距离:
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)
发布于 2018-01-21 04:16:04
我不确定你的类型是如何定义的,但我会假设它们是这样的:
type mm = number & { "**type**": "mm" }
type m = number & { "**type**": "m" }
type km = number & { "**type**": "km" }这可能是表示它们的最轻量级的方式:只在运行时使用数字。或者,您可能希望它们成为功能齐全的对象。
重要的是,它们之间有一个共同的属性(在本例中为"**type**"),它们具有不同的字符串字面值("mm"、"m"和"km")。然后你可以这样做:
interface KiloMap {
mm: m
m: km
}
interface UnkiloMap {
m: mm
km: m
}它表示您想要的映射。TypeScript擅长将字符串文字映射到常规类型(实际上,这就是接口),但不太擅长将常规类型映射到常规类型(至少在没有建议的extended typeof特性的情况下不是这样)。
最后,您可以编写您的函数类型:
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;
}并验证它们是否按预期工作:
const oneMeter = 1 as m;
const oneThousandthOfAKilometer = kilo(oneMeter); // km
const oneThousandMillimeters = unkilo(oneMeter); // mm您可以根据需要添加新的类型/映射/函数。希望这能有所帮助;祝你好运!
https://stackoverflow.com/questions/48360413
复制相似问题