如果在对象中定义了可选键,是否可以返回其他类型。在以下代码中,我试图解释我要实现的目标:
interface Model {
name: string;
}
interface Arg {
id?: number;
}
const func = (obj: Arg): Arg["id"] extends number ? Model : Model[] => {
if (obj.id) {
return eval(""); // will return Model;
} else {
return eval(""); // will return Model[];
}
}
const all = func({}); // correct `Model[]` inference
const single = func({ id: 1 }); // expected inference `Model`, actually `Model[]`
忽略此处的eval
调用,在我的实际代码中,这实际上也是一个返回any
的服务。我想从此函数恢复它的功能是,每次我将id
传递给对象作为参数时,它都会返回一个Model
,否则返回Model[]
。
我希望我的方法签名正确无误
(obj: Arg): Arg["id"] extends number ? Model : Model[]
但是这似乎不起作用,有没有办法使它恢复我的期望?
答案 0 :(得分:1)
Arg["id"]
总是会带您number | undefined
。您必须使该函数具有通用性:
const func = <T extends Arg>(obj: T): T["id"] extends number ? Model : Model[] => {
if (obj.id) {
return eval(""); // will return Model;
} else {
return eval(""); // will return Model[];
}
}
现在T
是指实际参数的类型,而不是Arg
接口。