【问题标题】:TypeScript: How to "change" type of method parameter inside method?TypeScript:如何在方法中“更改”方法参数的类型?
【发布时间】:2019-06-21 07:22:56
【问题描述】:

我有一张发票可以在新/已开票状态。我有一个接受新发票并返回发票发票的 doInvoicing 方法。但我无法在我的方法中更改发票的状态,因为它已绑定到新状态。

目前我只能考虑将输入发票转换为 Invoiced。但是,这会在类型检查中留下一个漏洞,因为它无法验证我是否将发票状态设置为已开票。我认为此操作所需的操作必须结合转换/设置值的步骤(如果可能)。

doInvoicing(invoice: Invoice & { state: invoiceState.New }):
        Invoice & { state: invoiceState.Invoiced } {

    var invoiced = invoice as Invoice & { state: invoiceState.Invoiced }; 
    invoiced.state = invoiceState.Invoiced;    // This MUST happen, but unverified
    return invoiced;
}

enum invoiceState {
    New, Invoiced
}

【问题讨论】:

    标签: typescript function types parameters restriction


    【解决方案1】:

    按照您的设置方式,如果不创建新的发票对象(或者,当然,用类型断言或any 捏造),我看不出有什么方法:

    return {...invoice, state: InvoiceState.Invoiced};
    

    请注意,spread 只是一个浅拷贝,在这里似乎就足够了,但是...

    【讨论】:

    • 我喜欢这个解决方案,可能不需要副本,但我会更多地研究 ... 运算符。
    • 是的,它是避免编译时问题的运行时副本这一事实确实困扰了我。 :-) (顺便说一句,... 不是运算符,它是主要语法。运算符不能做它所做的事情。)
    【解决方案2】:

    我找到了一个可以避免复制的解决方案。将更改封装在“setProperty”方法中:

    changeProp<V extends T[K], T, K extends keyof T>(obj:
            { [P in keyof T]: T[P] }, key: K, value: V): T & { [P in K]: V } {
    
        obj[key] = value;   // The required change is not verified, but at least only 1 copy for entire program
        return obj as T & { [P in K]: V };
    }
    

    这有一个问题,即返回的类型仅在 V 中被限制为 V 类型,而不是传入的值。但是可以用显式的泛型参数来说明:

    var invoiced: InvoicedInvoice = this.changeProp<invoiceState.Invoiced, Invoice, "state">(invoice, "state", invoiceState.Invoiced);
    

    现在的问题是必须声明所有泛型参数,而不仅仅是 V。最好只声明 V 或不声明任何泛型参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多