簡體   English   中英

了解條件類型的類型推斷

[英]Understanding type inference with conditional types

我很難理解為什么 TypeScript 在這里將program.options推斷為ProgramAOptions | ProgramBOptions ProgramAOptions | ProgramBOptions 因此它無法編譯代碼,因為optAProgramBOptions中不存在。 您能否解釋或指出解釋此行為的文檔?

type ProgramName = 'a' | 'b';

type ProgramAOptions = {
    optA: number;
};

type ProgramBOptions = {
    optB: number;
};

type Program<T extends ProgramName> = {
    name: T;
    options: T extends 'a' ? ProgramAOptions : ProgramBOptions;
};name

function test(p: Program<ProgramName>) : void
{
    if (p.name === 'a')
    {
        p.options.optA = 10; /* this line would not compile with error:

        error TS2339: Property 'optA' does not exist on type 'ProgramAOptions | ProgramBOptions'.
        Property 'optA' does not exist on type 'ProgramBOptions'.*/
    }
}

通過為每對名稱和選項顯式聲明接口,我將通過以下方式解決您的問題:

type ProgramName = 'a' | 'b';

interface ProgramAOptions {
    optA: number;
};

interface ProgramBOptions {
    optB: number;
};

type ProgramOptions = ProgramAOptions | ProgramBOptions;

interface Program {
    name: ProgramName;
    options: ProgramOptions;
}

interface ProgramA extends Program {
    name: 'a';
    options: ProgramAOptions;
}

interface ProgramB extends Program {
    name: 'b';
    options: ProgramBOptions;
}

type Programs = ProgramA | ProgramB;

function test(p: Programs): void {
    if (p.name === 'a') {
        p.name // is of type "a"
        p.options.optA = 10; // Works
    }
}

TypeScript操場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM