typescript - TypeScript:如何限制第二个参数值(基于第一个)
问题描述
如果有类似的定义
type GroupIds = 'A'|'B'|'C'
type KeysA = 'A01' | 'A02'
type KeysB = 'B03' | 'B04'
type KeysC = 'C99'
我知道它可以写成
function MethodBy( p0:'A', p1:KeysA )
function MethodBy( p0:'B', p1:KeysB )
function MethodBy( p0:'C', p1:KeysC )
function MethodBy( p0, p1 )
{
//implement
}
但是我想问一下有没有这样的
//maybe define a mapper
type IMapForKeys<T extends GroupIds> =
{
[ key: 'A' ]: KeysA
[ key: 'B' ]: KeysB
[ key: 'C' ]: KeysC
}
//then method can write like...
function MethodBy<T extends GroupIds>( p0:T, p1:IMapForKeys[T] )
{
//implement
}
或者有什么解决方法,希望得到提示,谢谢:)
解决方案
一个可能的解决方案是使用有区别的联合。这是一个例子:
type MyTypeA = {
p0: "A";
p1: 'A01' | 'A02';
}
type MyTypeB = {
p0: "B";
p1: 'B03' | 'B04';
}
type MyTypeC = {
p0: "C";
p1: 'C99';
}
function MethodBy(args: MyTypeA | MyTypeB | MyTypeC) {
//
}
//e.g.
MethodBy({ p0: "B", p1: "B04" }); //OK
MethodBy({ p0: "B", p1: "C99" }); //compile error
推荐阅读
- typescript - 选定的选项未滚动到 mat-select 中的视图中
- java - 无法使用发布工具或 URL 删除 solr 文档(使用查询)
- java - 何时将活动传递给另一个类会导致内存泄漏?
- c++ - Vulkan --- vkAcquireNextImageKHR 在使用某些队列族时抛出 std::out_of_range
- circleci - 找不到更改日志,因为没有给出版本代码 - 请指定:version_code
- r - 从 exec 目录执行脚本
- javascript - 将参数从 Vue 发送到 Laravel 控制器以更新道具
- odoo-13 - ir.actions.act_window 中的 src_model 在哪里?
- linux - 如何在 Ubuntu 上运行 Kotlin?
- java - 如何将自定义 jar 文件添加到 pom.xml