【问题标题】:function discriminated in typescript打字稿中区分的功能
【发布时间】:2020-07-06 06:22:28
【问题描述】:
const enum Tag {
  Friday = 'Friday',
  Planning = 'Planing',
}
const test = (tag: Tag, todo:/* ??? */): string => {/* some logic */}

tagTag.Friday 时,todo 应该是(tour: string) => string

tagTag.Planning 时,todo 应该是(date: Date) => string

我尝试了函数可区分联合和函数重载,两者都无法推断出todo 类型。 TS Playground

【问题讨论】:

    标签: typescript overloading discriminated-union


    【解决方案1】:

    如果将函数声明为接口,则可以在 TypeScript 中使用函数重载。

    例如:

    const enum Tag {
      Friday = 'Friday',
      Planning = 'Planing',
    }
    type TourFunc = (tour: string) => string
    type DateFunc = (date: Date) => string
    interface Fn {
      (tag: Tag.Friday, todo: TourFunc): string;
      (tag: Tag.Planning, todo: DateFunc): string;
    }
    
    const test: Fn = (tag: Tag, todo: TourFunc | DateFunc): string => {
      return 'a';
    }
    
    const dateFunc : DateFunc = (a: Date) => a.toDateString()
    const tourFunc : TourFunc = (b: string) => b
    test(Tag.Planning, (s: string) => 'a'); // Error
    test(Tag.Planning, dateFunc); // Ok 
    test(Tag.Friday, tourFunc); // Ok
    test(Tag.Planning, tourFunc); // Error
    
    

    Playground Link

    【讨论】:

    • todo 是一个函数。 Playground。还是不行
    • 其实这是意料之中的。在您的示例中,test(Tag.Planning, (s: string) => 'a'); 将按预期导致错误。但是,当您不向函数传递任何参数时,该函数可以同时匹配TourFuncDateFunc。检查我的更新
    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 2020-04-25
    • 2021-06-30
    • 1970-01-01
    • 2021-07-16
    • 2017-12-19
    相关资源
    最近更新 更多