Return泛型参数的默认值

Return default value of generic parameter

来自 C#。我们如何 return Typescript 中泛型参数的默认值?例如,这是 C# 中一个完全无用的函数:

private T TwiceAsMuch<T>(T number)
{
  if (number is int n)
    return (T)(object)(n * 2);
  else if (number is float f)
    return (T)(object)(f * 2);
  else
    return default;
}

如何在 Typescript 中实现最后一行 return default

上下文

我正在编写一个小包装函数,它执行 axios.post 和 returns 调用者指定类型的响应:

private static async postInternal<T>(route: string, data: unknown): Promise<T> {
  await Vue.$axios.get('/sanctum/csrf-cookie')
  const res = await Vue.$axios.post<T>(`${route}`, data)
    .then(res => res.data)
    .catch(err => {
      openErr(err)
      return ???
    })
}

用什么代替 ???

很抱歉,没有等效项。值有类型,但类型可能永远不会有值,无论是默认值还是其他。

我对 C# 一无所知,但根据 this answer return default 的说法:

default keyword will return null for reference types and zero for numeric value types.

Typescript 中不存在此模式。与 C# 不同,Typescript 转换为 javascript。 javascript 没有静态类型。这意味着在运行时,您无法知道 T 的类型。它完全从执行代码中消失了。

这个打字稿:

postInternal<number>('/path', { data: true })

还有这个打字稿:

postInternal<{ a: { b: { c: number } } }>('/path', { data: true })

两者都编译为 javascript:

postInternal('/path', { data: true })

这意味着 T 的类型在运行时无法 知道。因此,您不能仅根据 T 的类型来分支代码路径。


通常处理这种情况的方法是允许结果可以为空,然后在错误情况下 return null

private static async postInternal<T>(route: string, data: unknown): Promise<T | null> {
  //...
}

const num = postInternal<number>('/path', { data: true }) ?? 0

或者通过简单地抛出错误并让调用者捕获它并从那里处理要做什么。

try {
  const num = postInternal<number>('/path', { data: true })
} catch (error) {
  console.error('exploded :(', error)
}