在 Typescript 中按字符串返回不同的类型
Posted
技术标签:
【中文标题】在 Typescript 中按字符串返回不同的类型【英文标题】:Return different type by string in Typescript 【发布时间】:2017-10-13 00:32:22 【问题描述】:鉴于我们有以下两种不同的类型,我们如何根据字符串参数更改函数的返回而不提供泛型类型?
interface Type1 typeName: string; ;
interface Type2 typeVersion: string; ;
type AllTypes = Type1 | Type2;
function returnTypes(t: string): AllTypes
...
const typeResult = returnTypes('type1');
console.log(typeResult.typeName);
这里没有定义return!
【问题讨论】:
【参考方案1】:像这样创建一个重载声明
interface Type1 typeName: string; ;
interface Type2 typeVersion: string; ;
type AllTypes = Type1 | Type2;
function returnTypes(t: 'type1'): Type1;
function returnTypes(t: 'type2'): Type2;
function returnTypes(t : 'type1' | 'type2'): AllTypes
switch (t)
case "type1": return typeName: "test" ;
case "type2": return typeVersion: "test" ;
console.log(returnTypes('type1').typeName);
console.log(returnTypes('type2').typeVersion);
请注意,当您以这种方式重载函数时,调用者无法使用实现签名。只有预先指定的声明才构成重载函数的接口。
更新:修正并完成了示例,表明 TypeScript 知道它返回的是哪种类型。
【讨论】:
如何将t
(字符串)转换为返回类型Type
或Type2
?
罗德里戈,感谢您的编辑。现在更清楚了。 @PRAISER 我不确定我是否理解这个问题,你能改写一下吗?
在使用const a = () =>
格式时是否可以使用上述语法还是必须是function a ()
?
@ArturTagisow 如果您利用类型推断,它就可以工作。编译器将识别参数和返回类型之间的相关性。但是,如果你想把它写出来,或者你在环境上下文中,你需要使用函数类型的联合,它会变得丑陋typescriptlang.org/play/…【参考方案2】:
我不确定您要做什么,但 似乎 您正在尝试定义一个返回多种类型之一的函数。例如,该函数将返回 Type1 或 Type2。除非这两种类型共享一组共同的功能,否则您需要在对返回的对象调用可能不同的方法之前检查类型。
假设您要返回的对象确实共享一组通用功能,最好在接口中定义它,然后声明您要返回的每个对象类型都实现该接口。
举个例子。
interface CommonStuff
someFunction();
someOtherFunction();
class Type1 implements CommonStuff
someFunction()
someOtherFunction()
class Type2 implements CommonStuff
someFunction()
someOtherFunction()
然后让你的函数返回一个 CommonStuff 类型
returnTypes(str:String) : CommonStuff
let x : Type1;
let y : Type2;
...
const z = someCondition ? x : y ;
return z;
这避免了以后需要检查类型
const something = returnTypes("blah);
something.someFunction(); // you know something has a someFunction() method.
【讨论】:
类型不一样,它们可能有一些共同的属性,但我期待看到不同之处而不是共同点。我更新了问题以更好地澄清它。【参考方案3】:您可以使用模板类型 https://www.typescriptlang.org/docs/handbook/generics.html
private returnTypes<T>(arg:T): T
return arg
否则你必须根据你的 arg 设置 switch case
returnTypes(arg:string): AllTypes
switch(arg)
case "type1": return SomethingOfType1
case "type2": return SomethingOfType2
有关您要完成的工作的更多信息可能会有所帮助。
【讨论】:
这个解决方案不能解决问题,最后一旦函数返回结果,它会返回Type1
或Type2
是哪一个?以上是关于在 Typescript 中按字符串返回不同的类型的主要内容,如果未能解决你的问题,请参考以下文章