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)
}
来自 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 returnnull
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)
}