首页 > 解决方案 > 如何使用 TypeScript 中的其他函数修复“未知”函数值

问题描述

我有一个主要功能来完成所有处理,许多其他方法将使用它。

然而,唯一的问题是,根据 TypeScript 编译器,“我不知道什么是未知的”。

async function main_function(url: string): Promise<unknown> {
  // doComplexStuff();
  const data = await fetch(url);
  return data.json();
}

当我想修改这些函数的类型时,就会出现问题。

function req_1(url: string): Promise<something> { return main_function(url); }
function req_2(url: string): Promise<other> { return main_function(url); }
function req_3(url: string): Promise<blah_blah> { return main_function(url); }

据我所知,我可以使用函数语法上的类型参数或as方式来做到这一点,但这些似乎更像是一种解决方法,也不是那么优雅。

标签: javascripttypescriptpromisecompilation

解决方案


data.json()返回 type any,因此 Typescript 无法确定输出类型应该是什么,除非您明确告诉它。

那么你最好的选择是使用泛型,最好保护返回的类型,以确保它实际上是你所期望的。

async function main_function<T = unknown>(url: string): Promise<T> {
  // doComplexStuff();
  const data = await fetch(url);
  return data.json();
}
function req_1(url: string): Promise<something> { return main_function(url); }
function req_2(url: string): Promise<other> { return main_function(url); }
function req_3(url: string): Promise<blah_blah> { return main_function(url); }

请注意,您不必指定main_function<something>,因为 Typescript 可以根据 req 函数 ( Promise<something>) 的预期结果推断出它。

正如我所提到的,最好检查结果是否也是正确的类型,例如:

function req_1(url: string): Promise<something> {
  const result = main_function(url);
  if (/* result is something */) {
    throw new Error('Got a response that was not of type \'something\'')
  }
  return result
}

推荐阅读