typescript 打字脚本编译问题

6rqinv9w  于 2023-01-18  发布在  TypeScript
关注(0)|答案(2)|浏览(185)

我有一个复杂的界面。它的一个简单版本应该是这样的

Interface Person {
'name': string, 'address': string, 'age': number, 'height': number 
}

const person:Person = {'name': 'Yair', 'address': 'here', 'age': 12, 'height': 186}

现在假设我想创建一个函数来动态地更新名字或地址,这个函数运行得很好:

let updateNameOrAddress = (key: "name"|"address", value: string): void => {
    person[key] = value
}

然而,当我添加越来越多的字符串字段时,用这种方法定义键会变得很困难,所以我尝试这样做:

let updateNameOrAddress = (key: keyof Person, value: string): void => {
    person[key] = value
}

好吧,这就产生了这个错误:类型'string'不能赋值给类型'never'我有理由相信这是因为name现在也可以是"age"或"height"。我坚持添加类型作为"name"的可能性--但是我的真实对象有很多值。有没有办法获取keyof,只检索string/numeric键?
先谢了

7gs2gvoe

7gs2gvoe1#

使用generics,您可以检查更改的键,并将其Map到Person,以通用方式检索属性的值类型。
注意,T正在访问Person[T],这意味着value参数的类型可以根据给定的key参数来确定。

interface Person {
  'name': string, 'address': string, 'age': number, 'height': number
}

const person: Person = { 'name': 'Yair', 'address': 'here', 'age': 12, 'height': 186 }

const updateNameOrAddress = <T extends keyof Person>(key: T, value: Person[T]): void => {
  person[key] = value;
}

updateNameOrAddress("name", "John"); // Ok
updateNameOrAddress("age", "47"); // Error!
updateNameOrAddress("age", 47); // Ok

Playground

iyr7buue

iyr7buue2#

有没有办法获取keyof,只检索字符串/数字键?

interface Person {
  'name': string;
  'address': string;
  'age': number;
  'height': number;
}

type KeysOfType<T, U> = {
  [K in keyof T]: T[K] extends U ? K : never
}[keyof T];

const person: Person = { 'name': 'Yair', 'address': 'here', 'age': 12, 'height': 186 }

let updateNameOrAddress = (key: KeysOfType<Person, string>, value: string): void => {
  person[key] = value
}

TSPlayground

相关问题