在对象参数中定义键时的条件类型

时间:2019-09-26 08:35:29

标签: typescript typescript-typings

如果在对象中定义了可选键,是否可以返回其他类型。在以下代码中,我试图解释我要实现的目标:

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[]

但是这似乎不起作用,有没有办法使它恢复我的期望?

Typescript playground link

1 个答案:

答案 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接口。

Playground