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

前端 - 如何解决 TS 报错:T[Extract<keyof T, string>] is not assignable to type (T & U)[Extract<keyof T, string>] ?

郑桐
2023-06-01

代码如下

function extend<T extends object, U extends object>(first: T, second: U): T & U {
    let result = {} as T & U;
    for (let id in first) {
        result[id] = first[id]; // 这里报错
    }
    for (let id in second) {
        if (!result.hasOwnProperty(id)) {
            result[id] = second[id]; // 这里报错
        }
    }

    return result;
}

const x = extend({ a: 'hello' }, { b: 100 });
console.log(x.a, x.b)

报错信息如下

Type 'T[Extract<keyof T, string>]' is not assignable to type '(T & U)[Extract<keyof T, string>]'.
  Type 'T' is not assignable to type 'T & U'.
    Type 'object' is not assignable to type 'T & U'.
      Type 'object' is not assignable to type 'T'.
        'object' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'object'.
          Type 'T' is not assignable to type 'U'.
            'T' is assignable to the constraint of type 'U', but 'U' could be instantiated with a different subtype of constraint 'object'.

是不是这种情况不应该用 T&U 作为函数返回结果的类型?

共有1个答案

艾骏喆
2023-06-01

断言一下。比如

function extend<T extends object, U extends object>(first: T, second: U): T & U {
  const result = {} as T & U
  for (const id in first) {
    ;(<T>result)[id] = first[id]
  }
  for (const id in second) {
    if (!Object.prototype.hasOwnProperty.call(result, id)) {
      ;(<U>result)[id] = second[id]
    }
  }

  return result
}

const x = extend({ a: 'hello' }, { b: 100 });
console.log(x.a, x.b)
 类似资料:
  • 请问这2种写法有什么区别?我VSCode运行都是可以运行的。

  • 描述 (Description) 它将返回列表中指定位置的值。 它采用list (由逗号或空格分隔的值列表)和index (指定要返回的元素的位置的整数)作为参数。 例子 (Example) 以下示例演示了在LESS文件中使用提取函数 - <!doctype html> <head> <title>Extract Function</title> <link rel

  • Command/function extract in your console What’s a good way to extract: .zip, .rar, .bz2, .gz, .tar, .tbz2, .tgz, .Z, .7z, .xz, .exe, .tar.bz2, .tar.gz, .tar.xz, .arj, .cab, .chm, .deb, .dmg, .iso, .lz

  • 英文原文:http://www.phpconcept.net/pclzip/user-guide/55 概述 本方法用于解压压缩包中的文件和目录。 用法 PclZip::extract([可选参数]) 参数 参数 支持的可选参数 PCLZIP_OPT_PATH PCLZIP_OPT_REMOVE_PATH PCLZIP_OPT_REMOVE_ALL_PATH PCLZIP_OPT_ADD_PAT

  • Inno Setup 是一个为 Windows 应用程序创建安装程序的工具。主要是用于在非 Windows 下使用 Wine 作为运行环境的程序。

  • 单文件、无三方依赖、支持在线规则升级、非标准协议的 URL 关键词提取工具。 使用 <dependency>  <groupId>com.ecfront</groupId>  <artifactId>keyword-extract</artifactId>  <version>1.4</version></dependency> // 关键词提取KeyWordExtract.Result resu