【问题标题】:Mapped Type For Optional Arguments可选参数的映射类型
【发布时间】:2019-04-21 10:28:54
【问题描述】:
interface Foo{
  one: string;
  two?: number;
  someFunc: (args: string|number) => string
}

所以,我正在寻找一种声明“args”类型的方法;

我想知道是否有办法指定 args 的类型。参数“二”是可选的。如果用户指定参数“二”,我希望 someFunc 将 args 作为数字和字符串,否则除了使用联合类型之外,还有其他方法吗?

谢谢。

【问题讨论】:

    标签: typescript typescript-typings


    【解决方案1】:

    你想要:

    type Foo =
      | {one: string, two: number, someFunc(args: string): string}
      | {one: string, someFunc(args: number): string}
    

    【讨论】:

    • 感谢 bcherny 的所有帮助。
    【解决方案2】:

    您可以使用联合来代替接口。一个联合成员将具有two 所需的if 类型编号,并具有args 的适当类型,联合的另一个成员将具有twooptional 和never 类型,以确保其与另一个不兼容工会会员。您将对参数类型进行推理,但编译器将验证函数是否具有适当的参数类型。

    type Foo = {
        one: string;
        two?: never;
        someFunc: (args: number) => string
    } | {
        one: string;
        two: number;
        someFunc: (args: string) => string
    }
    
    let foo: Foo = {
        one: '',
        someFunc : (a: string) => a
    } // err
    
    let foo2: Foo = {
        one: '',
        someFunc : (a: number) => a.toString()
    } // ok
    
    let foo3: Foo = {
        one: '',
        two:2,
        someFunc : (a: string) => a
    } // ok
    
    let foo4: Foo = {
        one: '',
        two:3
        someFunc : (a: number) => a.toString()
    } // err
    

    【讨论】:

    • 非常感谢。效果很好。
    猜你喜欢
    • 1970-01-01
    • 2018-11-21
    • 2019-12-03
    • 2018-09-14
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    相关资源
    最近更新 更多