在 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(字符串)转换为返回类型TypeType2 罗德里戈,感谢您的编辑。现在更清楚了。 @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
    

有关您要完成的工作的更多信息可能会有所帮助。

【讨论】:

这个解决方案不能解决问题,最后一旦函数返回结果,它会返回Type1Type2是哪一个?

以上是关于在 Typescript 中按字符串返回不同的类型的主要内容,如果未能解决你的问题,请参考以下文章

基于可选函数参数的不同返回类型 - Typescript

TypeScript - 特定的字符串类型

在 Typescript 中,如何声明一个返回字符串类型数组的函数?

#yyds干货盘点#学会TypeScript中函数重载写法

TypeScript:返回与参数相同的类型

TypeScript:你能根据函数的参数定义一个返回类型结构吗?