打字稿中的条件类型可以依赖于其自身的值吗?

Zhe*_*nko 2 javascript typescript

我可以在打字稿中实现这种类型吗?

type Someone = {
  who: string;
}

type Someone = Someone.who === "me" ? Someone & Me : Someone;

Run Code Online (Sandbox Code Playgroud)

Yon*_*uan 6

是的,您可以借助泛型分布式条件类型联合来做到这一点。

下面是一个最低限度的工作示例:

type Someone<T extends string> = {
    who: T;
}

type Me = {
    me: boolean;
}

type Thisone<T extends string> = T extends 'me' ? Someone<T> & Me : Someone<T>;

function whoami<T extends string>(who: T) {
    return {
        who,
        me: who === 'me' ? true : undefined
    } as Thisone<T>
}

const a = whoami('you');
const b = whoami('me');

a.who;  // ok
a.me;   // error

b.who;  // ok
b.me;   // ok
Run Code Online (Sandbox Code Playgroud)

在 TypeScript Playground 中进行演示


小智 5

我认为受歧视的工会可以发挥作用:

type Me = {
  who: 'me',
  secret: string;
}

type Other = {
  who: 'other',
}

type Someone = Me | Other;
Run Code Online (Sandbox Code Playgroud)