如何根据打字稿中的其他参数类型设置第一个参数类型可选性

How to set 1st arg type optionality based on other arg type in typescript

我想创建接受 2 个柯里化参数的函数。

最终我想 TParam 在任何参数中传递类型但不是两次

这是我最好的 'not' 工作解决方案..

type TParam = {
    a: string;
    b: string;
}

const param: TParam = { a: "string", b: "string" };

type Check<T> = T extends TParam ? void : TParam

const example = <T extends TParam>(arg0?: T) => (arg1: Check<T>) => {
    if (typeof arg0 === 'object') {
        return arg0;
    }

    return arg1;
}

const ok = example()(param)  // Wrong
const ok1 = example(param)() // Ok

const error = example({})()  // Ok

您可以使用 function overloading 实现此目的。 以下是一个工作示例。您也可以在此 playground link.

尝试一下
type TParam = { 
    a: string;
    b: string; 
}

const param: TParam = { a: "string", b: "string" };

function example(x: TParam): () => TParam; 
function example(): (x: TParam) => TParam; 
function example(x?: TParam) {   
    if(x) {
        return () => x   
    }   
    else {
        return (x: TParam) => x   
    } 
} 
const ok = example()(param)   // No error 
const ok1 = example(param)()  // No error 
const error = example({})()   // Error, which is expected