【发布时间】:2021-01-23 08:14:13
【问题描述】:
我的目标是根据可选的condition: "CONDITION" 参数的存在返回不同的类型。我正在尝试在不使用重载的情况下完成此任务。
type TYPE_1 = "TYPE_1"
type TYPE_2 = "TYPE_2"
type CONDITION = "CONDITION"
function foo(condition?: CONDITION): TYPE_1 | TYPE_2 {
if (condition) {
return "TYPE_1";
}
else {
return "TYPE_2";
}
}
const shouldBeType_1 = foo("CONDITION"); // ERROR: THIS IS BEING EVALUATED AS UNION TYPE: "TYPE_1" | "TYPE_2"
const shouldBeType_2 = foo(); // ERROR: THIS IS BEING EVALUATED AS UNION TYPE: "TYPE_1" | "TYPE_2"
这很容易通过重载来实现:
/* ########################################### */
/* #### THIS IS EASY TO DO WITH OVERLOADS #### */
/* ########################################### */
function foo_overloaded(): TYPE_2
function foo_overloaded(condition: "CONDITION"): TYPE_1
function foo_overloaded(condition?: "CONDITION"): TYPE_1 | TYPE_2 {
if (condition) {
return "TYPE_1";
}
else {
return "TYPE_2";
}
}
const overloaded_shouldBeType_1 = foo_overloaded("CONDITION"); // SUCCESS: THIS IS TYPE_1
const overloaded_shouldBeType_2 = foo_overloaded(); // SUCCESS: THIS IS TYPE_2
没有重载的正确方法是什么?还是我过于复杂了,而在这种情况下,重载只是一种方法?
这里也有这个问题:TypeScript: function return type based on argument, without overloading
它建议应该将接口用作返回类型的映射,例如:
interface Registry {
A: number,
B: string,
C: boolean
}
function createType<K extends keyof Registry>(type: K, value: Registry[K]): Registry[K] {
return value;
}
但我不能这样做,因为condition 要么是"CONDITION" | undefined。那么如何映射undefined 类型呢?我也尝试使用条件类型来做到这一点。比如:
type RETURN_TYPE<T extends undefined | "CONDITION"> = T extends "CONDITION" ? TYPE_1 : TYPE_2;
但这也没有用。
【问题讨论】:
标签: typescript overloading typescript-typings optional-parameters