Typescript 如何将强类型添加到此开关替代函数? const switchcase=value,cases,defaultCase=>{ 常量值字符串=字符串值; const result=Object.keyscases.includeValueString ?案例[valueString] :拖欠个案; 返回结果的类型=='function'?结果:结果; };

Typescript 如何将强类型添加到此开关替代函数? const switchcase=value,cases,defaultCase=>{ 常量值字符串=字符串值; const result=Object.keyscases.includeValueString ?案例[valueString] :拖欠个案; 返回结果的类型=='function'?结果:结果; };,typescript,types,Typescript,Types,我想了解如何向上面的JavaScript函数添加类型,同时避免使用任何类型,除非必要。我知道value参数可能是any,但我不确定cases、defaultCase和函数的返回类型 提前谢谢 函数的返回类型取决于您希望返回的内容 不过,这里有一种说法。您需要修改ExpectedReturnType以反映您想要从函数中得到什么,并且您的案例需要是该类型,或者需要是算术为0并返回预期返回类型的函数 接口ExpectedReturnType{} //每种情况都是一个生成返回类型的函数 //还是类型本身

我想了解如何向上面的JavaScript函数添加类型,同时避免使用任何类型,除非必要。我知道value参数可能是any,但我不确定cases、defaultCase和函数的返回类型


提前谢谢

函数的返回类型取决于您希望返回的内容

不过,这里有一种说法。您需要修改ExpectedReturnType以反映您想要从函数中得到什么,并且您的案例需要是该类型,或者需要是算术为0并返回预期返回类型的函数

接口ExpectedReturnType{} //每种情况都是一个生成返回类型的函数 //还是类型本身 类型CaseType=ExpectedReturnType |=>ExpectedReturnType; 常量开关盒= 价值:任何, 案例:{[key:string]:案例类型}, defaultCase:CaseType :ExpectedReturnType=>{ 常量值字符串=字符串值; const result=案例中的valueString?案例[valueString]:defaultCase; 返回结果的类型===函数?结果:结果; }; 您还可以使用通用的:

function switchcase<T, U = T | (() => T)>(
  value: any,
  cases: { [key: string]: U },
  defaultCase: U
): T {
  const valueString = String(value);
  const result = valueString in cases ? cases[valueString] : defaultCase;
  return typeof result === "function" ? (result as Function)() : result;
}

// And you'd use it like so:
const cases = { foo: "bar", whee: () => "yay" };
switchcase("foo", cases, "bar");

// Or so:
switchcase<string>("foo", cases, "bar");

Typescript希望能从您传递的参数推断出T,但您始终可以将其称为switchcase。。。如果您需要特别键入。

谢谢您的回复。我正在尝试添加类型,以便将其作为一个模块使用。考虑到这一点,我不确定空接口是否是正确的返回类型。你能在回答中提到这些信息吗?当然,空界面不是正确的答案。因此,我的评论是为什么它取决于您期望函数返回什么。不过,您可以使用泛型参数化它;我会调整我的答案。是的,更新的版本更像我想象的。我还在学习关于泛型的推理,所以我将不得不花一些时间来研究它。泛型的思想是,T的类型要么是通过用法推断出来的,要么是用尖括号语法指定的。我们说cases和defaultCase都采用某种类型U的参数,要么是某种类型T的参数,或者某个生成T类型值的零算术函数。该函数本身返回T类型值。T的实际值取决于您如何使用switchcase。感谢您添加更多有关通用推断的信息。我仍然不明白两件事:1为什么TypeScript不能推断结果是返回行上的一个可调用函数。。。为什么在通过运行时条件建立函数类型之后需要类型断言?2如果案例的类型是单独定义的,它会像这样吗?类型Case=T |=>T;类型Cases={[key:string]:Case};类型Switchcase=value:any,cases:cases,defaultCase:Case=>T;