使用泛型类型时,Typescript类型缩小不起作用



下面的代码类型缩小似乎在Typescript版本3.8(Angular 9前端(中不起作用我试着做一些实验,但没有进展。

  • 我认为这与我错误地使用枚举无关,但它涉及到在TypeScript中扩展泛型的一些复杂性
  • 也许如果我想让代码缩小工作,但我使用了错误的方式来定义接口

有人能给我一个提示吗?

请参阅下面或StackBkitz代码以显示我的情况

export enum DetailType {
A = 'A',
B = 'B',
C = 'C',
}
interface D1 {
type: DetailType.A;
}
interface D2 {
type: DetailType.B;
}
interface D3 {
type: DetailType.C;
}
type Detail = D1 | D2 | D3;

type SystemFinding<detailType extends Detail> = {
detail: detailType;
};
interface Finding<detailType extends Detail> extends SystemFinding<detailType> {
findingUid?: string;
}

type FindingSummary<T extends Detail> = {
prop1: string;
prop2: Finding<T>;
};

function runA(st: FindingSummary<D1>) {
console.log(st);
}
function runB(st: FindingSummary<D2>) {
console.log(st);
}
function runC(st: FindingSummary<D3>) {
console.log(st);
}
function runTool(findingSummary: FindingSummary<Detail>) {
switch (findingSummary.prop2.detail.type) {
case DetailType.A:
findingSummary; // type is findingSummary: FindingSummary<Detail>, type narrowing isn't working?
runA(findingSummary);
break;
case DetailType.C:
findingSummary;
runB(findingSummary);
break;
case DetailType.C:
findingSummary;
runB(findingSummary);
break;
default:
}
}

现在,我必须使用类型转换。但我希望我不需要那样做。


function runTool(findingSummary: findingSummary<Detail>) {
switch (findingSummary.prop2.detail.type) {
case DetailType.A:
const a1: findingSummary<D1> = <findingSummary<D1>>findingSummary;
runA(a1);
break;
case DetailType.B:
const a2: findingSummary<D2> = <findingSummary<D2>>findingSummary; 
runB(a2);
break;
case DetailType.C:
const a3: findingSummary<D3> = <findingSummary<D3>>findingSummary; 
runC(a3);
break;
default:
}
}

最新更新