(可选)返回空对象

时间:2020-10-07 14:53:53

标签: typescript

我试图弄清楚如何在Typescript中返回一个空对象,我发现很难做到这一点。

举一个人为的例子,我们说:

interface Human {
    name: string,
    race: string,
    city: string
}

interface Alien {
    name: string,
    species: string,
    planet: string
}

type TransformedData = HumanAndroid | AlienPredator;

type HumanAndroid = {
    make: string;
    model: string;
    intelligence: number;
} | {}

interface AlienPredator {
    name: string,
    finishingMove: string,
    planet: string
}

export const transform = (
    input: Human | Alien,
    type: 'human' | 'alien' = 'human'
): TransformedData => {
    switch (type) {
        case 'human':
            return transformHuman(input as Human);
        case 'alien':
            return transformAlien(input as Alien);
    }
};

function transformHuman(human: Human ): HumanAndroid {
    if (human.name === '') {
        return {}
    }
    return {    
        make: "2020",
        model: "MDX343",
        intelligence: 100
    }
}

function transformAlien(alien: Alien): AlienPredator {
    return {    
        name: 'majinbuu',
        finishingMove: 'roundkick',
        planet: 'mars'
    }
}

HumanTransform函数的第一个return语句中:

if (human.name === '') {
    return {}
}

我可以将return语句更改为任何内容,例如:

if (human.name === '') {
    return {"randomKey": 4}
}

它不会导致错误。我该如何禁止除空物体之外的其他物体?

1 个答案:

答案 0 :(得分:0)

问题是,如果您说函数返回x,那么您可以返回也是x子类型的任何内容。

您可以使用以下类似方式明确禁止其他属性:

type R = {
  [k: string]: never
}

function foo(): R {

  return {a:1}; // error

}

这可以解决您的问题。从纯粹的库设计角度来看,我建议您返回null而不是空对象。