[英]Understanding type inference with conditional types
我很難理解為什么 TypeScript 在這里將program.options
推斷為ProgramAOptions | ProgramBOptions
ProgramAOptions | ProgramBOptions
。 因此它無法編譯代碼,因為optA
在ProgramBOptions
中不存在。 您能否解釋或指出解釋此行為的文檔?
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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.