代码之家  ›  专栏  ›  技术社区  ›  Joji

TypeScript:有没有一种方法可以键入一个函数,以便它根据参数动态返回不同类型的结果

  •  0
  • Joji  · 技术社区  · 4 年前

    这是一个非常做作的例子,所以请接受我:

    我有一个功能 foo . 它将此类型的对象作为其参数

    interface Foo {
      bar: number,
      baz: number,
      enabled?: boolean,
    }
    

    什么时候? enabled 不是由用户提供的,或者当它为false时, 将返回类型为的对象 Result

    interface Result {
      result: number
    }
    

    所以它只是把这两个数字相加

    
    function foo({bar, baz}: Foo): Result {
      return {
        result: bar + baz
      }
    }
    
    

    启用 在params中提供,并将其设置为 true isEqual ,表示如果 bar baz 是平等的。太像了

    interface AnotherResult {
       result : number,
       isEqual: boolean
    }
    

    const {result} = foo({baz: 1, bar: 2})
    
    // or
    
    const {result, isEqual} = foo({baz: 1, bar: 2, enabled: true})
    

    当用户包括 enabled: true ,它们可以破坏结构 从的返回值 当他们不提供 启用 enabled: false ,他们 不能 从的返回值 .

    这是我的尝试,但是我想不出一种基于params动态确定返回值类型的方法。我想知道用打字机是不是也可以

    nterface Foo {
      bar: number,
      baz: number,
      enabled?: boolean,
    }
    
    interface Result {
      result: number
    }
    
    interface IsEqual {
      isEqual: boolean
    }
    
    type ResultWithIsEqualEnabled = Result & IsEqual
    
    
    function foo({bar, baz, enabled = false}: Foo): ResultWithIsEqualEnabled {
      return {
        result: bar + baz
      }
    }
    
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   Николай Гольцев    4 年前

    可以使用函数重载:

    interface Foo {
      bar: number,
      baz: number,
    }
    
    interface FooEnabled extends Foo {
      enabled: true,
    }
    
    interface Result {
      result: number;
    }
    
    interface IsEqual extends Result {
      isEqual: boolean
    }
    
    function foo(foo: FooEnabled): IsEqual;
    function foo<T extends Foo>(foo: T): Result;
    function foo({bar, baz, enabled}: FooEnabled): Result | IsEqual {
      const result = baz + bar;
      
      if (enabled) {
        return {
          result,
          isEqual: bar === baz,
        }
      }
    
      return {
        result,
      }
    }
    
    const {result} = foo({
      bar: 5,
      baz: 5,
    });
    
    const {result: anotherOneResult, isEqual} = foo({
      bar: 5,
      baz: 5,
      enabled: true,
    })
    
        2
  •  0
  •   Naveen Chahar    4 年前

    可以在typescript中为函数定义多个返回类型。对于您的例子,您可以这样做:

        function foo({bar, baz,enabled=false}: Foo): Result | AnotherResult {
           return (enabled==true)?{result: bar + baz, isEqual: true}: {result: bar + baz} ;
        }