Typescript 如何强制方法param值成为接口的元素

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) =

我想强制方法param value为接口的任何元素

比如说,

我有一个这样的界面

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。这对我来说是一个很有价值的信息。谢谢你的回复。这对我来说是一个很有价值的信息。谢谢你的回复。