我有一个字符串文本类型,例如
type ConfigurationTypes = 'test' | 'mock'
有些类型
type MockType = { id: string }
type TestType = { code: string }
我想创建一个类型,将字符串“Map”到这些类型,这样如果ConfigurationTypes
发生变化,我的类型MappedConfigurationTypes
也会相应地发生变化,这可能吗?
type MappedConfigurationTypes: {[key in ConfigurationTypes]: any} = {
test: TestType
mock: MockType
}
2条答案
按热度按时间xtfmy6hx1#
从某种意义上说,你需要的是一个类型级的
satisfies
运算符,如果你写e satisfies T
,其中e
是一个表达式,T
是一个类型,编译器会确保e
可以赋值给T
,而不会扩展到T
。所以e
保持它的原始类型,但是如果与T
不兼容,你会得到一个错误。你想做同样的事情,但是用另一个类型替换表达式。但是没有这样的
Satisfies
类型运算符,太糟糕了。幸运的是,我们基本上可以自己建造一个:我们可以写
Satisfies<U, T>
而不是T Satisfies U
(我将"Satisfies U
"作为注意的语法单元,所以我希望使用Satisfies<U, T>
而不是Satisfies<T, U>
,但是您可以根据需要定义它)。定义如下:
您可以看到
Satisfies<U, T>
的计算结果总是T
,但是由于T
被限制为U
,因此如果T
与U
不兼容,编译器将发出警告。我们试试看:
看起来不错。如果将鼠标悬停在
MappedConfigurationTypes
上,您会看到它相当于另一方面,如果向
ConfigurationTypes
联合体添加另一个成员,则会看到预期的错误:Playground代码链接
tyu7yeag2#
我对jcalz提供的代码做了一些调整,然后找到了一个稍微好一点的解决方案:
它可以用作