Typescript 如何强制方法param值成为接口的元素
我想强制方法param value为接口的任何元素 比如说, 我有一个这样的界面Typescript 如何强制方法param值成为接口的元素,typescript,Typescript,我想强制方法param value为接口的任何元素 比如说, 我有一个这样的界面 interface User { userId : number; userName : string; } setUserState = (key : User , newValue : string) => { // Some code here } setUserState = (key : 'userName' | 'userId' , newValue : string) =
interface User {
userId : number;
userName : string;
}
setUserState = (key : User , newValue : string) => {
// Some code here
}
setUserState = (key : 'userName' | 'userId' , newValue : string) => {
// Some code here
}
参数应该是userId或userName。所以我定义了这样的方法
interface User {
userId : number;
userName : string;
}
setUserState = (key : User , newValue : string) => {
// Some code here
}
setUserState = (key : 'userName' | 'userId' , newValue : string) => {
// Some code here
}
很明显,它不起作用。所以我尝试了key:Partial,但它不起作用
我知道这是可以做到的
interface User {
userId : number;
userName : string;
}
setUserState = (key : User , newValue : string) => {
// Some code here
}
setUserState = (key : 'userName' | 'userId' , newValue : string) => {
// Some code here
}
但问题是,当我用新元素更新用户界面时,我还必须更新方法签名。这是毫无意义的
那么,强制参数值成为接口元素的最佳方式是什么呢?可能吗
编辑1
有任何一种操作员吗
编辑2
我使用的是2.9.2版
注意:我是打字脚本新手。试试这种方法
interface User {
readonly userId?: string;
userName?: string;
anyotherElement?: string
}
注:添加?紧随其后:使其成为可选的
然后您可以发送直接用户作为参数
setUserState = (user: User) => {
can access with `user.userId`
// Some code here
}
这样试试
interface User {
readonly userId?: string;
userName?: string;
anyotherElement?: string
}
注:添加?紧随其后:使其成为可选的
然后您可以发送直接用户作为参数
setUserState = (user: User) => {
can access with `user.userId`
// Some code here
}
让我们先这样试一下:
interface User {
userId : number;
userName : string;
}
const cur: User = {userId: 0, userName: 'root'}
const setUserState = (key : keyof User , newValue : string) => {
cur[key] = newValue;
// note: no error here, but this is erroneous,
// as cur['userId'] is number, and newValue is string!
}
setUserState('userId', '0');
setUserState('userName', 'root');
setUserState('wrong', 'wrong');
请注意函数内部的注释:它表明,一方面,通过该键访问用户对象字段的keyof类型定义是完全正常的,但另一方面,您必须自己处理特定字段的所有类型检查。TypeScript将无法检查newValue参数类型以匹配用户的相应字段。让我们先这样做:
interface User {
userId : number;
userName : string;
}
const cur: User = {userId: 0, userName: 'root'}
const setUserState = (key : keyof User , newValue : string) => {
cur[key] = newValue;
// note: no error here, but this is erroneous,
// as cur['userId'] is number, and newValue is string!
}
setUserState('userId', '0');
setUserState('userName', 'root');
setUserState('wrong', 'wrong');
请注意函数内部的注释:它表明,一方面,通过该键访问用户对象字段的keyof类型定义是完全正常的,但另一方面,您必须自己处理特定字段的所有类型检查。TypeScript将无法检查newValue参数类型以匹配用户的相应字段。您可以使用keyof运算符将第一个参数限制为用户属性之一。然后,您可以使用类型查询来限制第二个参数具有适当的类型:
interface User {
userId: number;
userName: string;
}
const user: User = { userId: 1, userName: 'userName' };
const setUserState = <TKey extends keyof User>(key: TKey, newValue: User[TKey]) => {
user[key] = newValue;
}
setUserState('userId', 1);
setUserState('userId', '1'); //Error '"1"' is not assignable to parameter of type 'number'
setUserState('foo', 1); //Error - '"foo"' is not assignable to parameter of type '"userName" | "userId"'
泛型用于重用属性值类型查询用户[TKey]中的键类型属性名称
可以使用keyof运算符将第一个参数限制为用户属性之一。然后,您可以使用类型查询来限制第二个参数具有适当的类型:
interface User {
userId: number;
userName: string;
}
const user: User = { userId: 1, userName: 'userName' };
const setUserState = <TKey extends keyof User>(key: TKey, newValue: User[TKey]) => {
user[key] = newValue;
}
setUserState('userId', 1);
setUserState('userId', '1'); //Error '"1"' is not assignable to parameter of type 'number'
setUserState('foo', 1); //Error - '"foo"' is not assignable to parameter of type '"userName" | "userId"'
泛型用于重用属性值类型查询用户[TKey]中的键类型属性名称
属性不能是可选的。很抱歉,我的问题中没有提到它。那么您不能使用用户界面,而是可以用一种简单的方法在functionOk中设置param:string。谢谢你的回复。有任何类型的运营商吗?没有,没有这样的选择。还请提及yiu正在使用的typescript版本,最新版本中添加了新功能。属性不能是可选的。很抱歉,我的问题中没有提到它。那么您不能使用用户界面,而是可以用一种简单的方法在functionOk中设置param:string。谢谢你的回复。有任何类型的运营商吗?没有,没有这样的选择。请同时提及yiu正在使用的typescript版本,最新版本中添加了新功能。Ok。这对我来说是一个很有价值的信息。谢谢你的回复。这对我来说是一个很有价值的信息。谢谢你的回复。