打字稿条件类型

时间:2019-03-21 17:13:29

标签: typescript

在某些情况下,我需要在Typescript中使用条件类型。我不确定100%是否可以使用我的方法来做到这一点,但我相信一定有办法。

在下面的示例中,我简化了代码。

type Friend = {
    phoneNr: number;
};

type Enemy = {
    howToAvoid: string[];
};

interface Names {
    edward: Friend;
    sam: Enemy;
}

const names: Names = {
    edward: {
        phoneNr: 1234,
    },
    sam: {
        howToAvoid: ["don't go there", "dont do that"],
    },
};

function select<T extends keyof typeof names>(arg: T): Friend | Enemy {
    return names[arg];
}

console.log(select("edward"));

简而言之,函数select()仅接受作为names键的2个参数(爱德华兹和sam)。 names包含一个人员列表,这些人员可以是EnemyFriendselect()可以返回EnemyFriend类型的对象。我知道这是两者之一,但是我不知道那是哪一个。

我想要的是能够知道select("edward")总是返回类型为Friend的对象,而select("sam")总是返回类型为{{1}的对象}。所有这些都假设我事先知道谁是朋友,谁是敌人。

我们能做到吗?

为了说明(通过混合TS和JS语法),我想执行以下操作:

Enemy

非常感谢!

1 个答案:

答案 0 :(得分:4)

您可以将参数作为类型的属性进行查找:

function select<T extends keyof typeof names>(arg: T): Names[T] {