如何根据打字稿中的其他参数类型设置第一个参数类型可选性
How to set 1st arg type optionality based on other arg type in typescript
我想创建接受 2 个柯里化参数的函数。
- 第一个参数 - 可以是具有特定属性的对象 (
TParam
) 或 void
- 第二个参数 - 如果第一个参数类型是 -
TParam
.[=26=,则应该是具有特定属性的对象 (TParam
) 或没有该属性的对象 (TParam
) ]
最终我想 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
我想创建接受 2 个柯里化参数的函数。
- 第一个参数 - 可以是具有特定属性的对象 (
TParam
) 或void
- 第二个参数 - 如果第一个参数类型是 -
TParam
.[=26=,则应该是具有特定属性的对象 (TParam
) 或没有该属性的对象 (TParam
) ]
最终我想 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