Typescript 如何基于另一个参数的值与函数参数的类型相交?
下面是一个基本的Typescript 如何基于另一个参数的值与函数参数的类型相交?,typescript,typescript-typings,typescript-generics,Typescript,Typescript Typings,Typescript Generics,下面是一个基本的用户类: class用户{ 私有用户:部分={}; 公共集( 关键:K, val:U[K], ):无效{ 此._用户[键]=val; } } 以及基本的员工界面: 界面员工{ 名称:字符串; 城市:字符串; 角色:数字; } 现在,考虑下面的实现: const admin=新用户(); 管理集(“名称”,10); 上述脚本会产生以下预期错误 “number”类型的参数不能分配给“string”类型的参数 现在看一下以下实现: const admin=新用户(); 管理员设
用户
类:
class用户{
私有用户:部分={};
公共集(
关键:K,
val:U[K],
):无效{
此._用户[键]=val;
}
}
以及基本的员工
界面:
界面员工{
名称:字符串;
城市:字符串;
角色:数字;
}
现在,考虑下面的实现:
const admin=新用户();
管理集(“名称”,10);
上述脚本会产生以下预期错误
“number”类型的参数不能分配给“string”类型的参数
现在看一下以下实现:
const admin=新用户();
管理员设置<“名称”|“角色”>(“名称”,10);
上述脚本不会产生任何错误,只要10
可分配给name
或role
为了更清楚,我们来看看下面的脚本:
const admin=新用户();
管理员设置<“名称”|“角色”>(“名称”,true);
上面的脚本产生以下错误,这也是预期的
“boolean”类型的参数不能分配给“string | number”类型的参数
现在,我想要实现的是,
10
无论如何都不应该被允许存储为name
的值
为此,我需要对我的代码进行一些类似于以下内容的更改:
public set(
关键:K,
val:U[键的值],
):无效{
此._用户[键]=val;
}
但只要没有类似键的值
,这就无法动态实现
对于测试,如果您将U[K]
替换为U[“name”]
,您将看到10
不再以任何形式被允许
然而,有什么方法可以实现我的目标吗
许多程序员通过应用T[keyof T]
解决了类似的问题,我认为这不适用于这种情况
提前谢谢
没有办法说K只能是一个特定的键,而不是键的并集。因此,没有办法说U[K]只能是一个值 你所做的是你能做的最好的。如果传递字符串文字值,Typescript将始终推断正确的K
另一种方法是使用set函数,该函数接受Partial并将键和值作为对象一起传递。这确保键和值必须始终相互匹配。但它也会以一种可能不受欢迎的方式改变您的用法。感谢您的贡献@Linda。也许TypeScript将来会提供此功能。