Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 如何基于另一个参数的值与函数参数的类型相交?_Typescript_Typescript Typings_Typescript Generics - Fatal编程技术网

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将来会提供此功能。