当前位置: 首页 > 知识库问答 >
问题:

typescript - 如何用 ts 写一个更新对象值的函数?

司信厚
2023-10-22

下面代码会报 ts 错误,如何如何解决?

interface Type1 {  src: string | null;  blur: number;  mask: number;}const obj1: Type1 = {  src: null,  blur: 0,  mask: 0,};function updateObj1(key: keyof Type1, value: Type1[keyof Type1]) {  obj1[key] = value; // Type 'string | number | null' is not assignable to type 'never'.}

共有2个答案

施永贞
2023-10-22

需要类型推导(infer)

interface Foo {  src: string | null;  mask: number;}const foo: Foo = {  src: null,  mask: 0,}function setFoo<K extends keyof Foo>(key: K, value: Foo[K]) {  foo[key] = value}setFoo('src', 'hello')
袁恩
2023-10-22

您在这里遇到的问题是因为 TypeScript 无法推断您试图更新的值是 Type1 对象的一个属性。在 TypeScript 中,keyof Type1 类型实际上是一个字符串字面量类型,它表示 Type1 对象的属性名称。所以 Type1[keyof Type1] 类型会被推断为 string | null | number,这是因为它取自 Type1 对象的属性。

为了解决这个问题,您需要在函数 updateObj1 中明确指定要更新的属性的类型。这是您需要做的更改:

interface Type1 {  src: string | null;  blur: number;  mask: number;}const obj1: Type1 = {  src: null,  blur: 0,  mask: 0,};function updateObj1(key: keyof Type1, value: Type1[keyof Type1][keyof Type1]) { // 注意这里的 [keyof Type1] 两次  obj1[key] = value; }

在这里,Type1[keyof Type1][keyof Type1] 是一个更精确的类型,它明确表示我们想要更新的值是 Type1 对象的一个属性值,而不是 Type1 对象本身。所以,当您将值赋给 obj1[key] 时,TypeScript 将能够正确地推断类型。

希望这能帮到您!如果您还有其他关于 TypeScript 的问题,欢迎继续提问。

 类似资料:
  • 我有一系列推车。我想更新请求对象中的产品数量。即。 我有一个数组的产品和数量,比如: 我想更新它们,如: 这可能的逻辑是什么?

  • 我有多个云函数使用一个值,基本上是这样的: 问题是我想要更改页脚内容(由返回),但为了这样做(就我所研究的),我首先必须在代码中更改它,然后部署使用的每个云函数(和),这样页脚在每种类型的电子邮件上看起来都是一样的。 当然,我可以使用同时部署所有函数,但是我们曾经是多个开发人员,我们中的一些人将函数更新到我们不知道index.js中哪些函数与GCP中的相同(大约20个函数),我必须检查每一个函数,

  • 我想给一个对象里所有值为null的属性赋其它值,比如: 有没有大佬知道 assignDefaults 这个函数如何实现?

  • 我正在使用齐柏林飞艇0.6.2和火花2.0。 我尝试在循环中执行查询,但效果不是很好。 我需要循环一个数据帧的每一行,大约5000行,并执行一个查询,这将在另一个数据帧中增加一个值。 以下是我的尝试: 我试着从两个数据帧中提取一小部分,但仍然很慢。我觉得我做得不对。 知道如何快速更新数据帧吗?

  • 这不是都找到类型了吗?这个报错是什么意思?如何解决呢? 消除错误