1/* 2* Copyright (c) Microsoft Corporation. All rights reserved. 3* Copyright (c) 2023 Huawei Device Co., Ltd. 4* Licensed under the Apache License, Version 2.0 (the "License"); 5* you may not use this file except in compliance with the License. 6* You may obtain a copy of the License at 7* 8* http://www.apache.org/licenses/LICENSE-2.0 9* 10* Unless required by applicable law or agreed to in writing, software 11* distributed under the License is distributed on an "AS IS" BASIS, 12* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13* See the License for the specific language governing permissions and 14* limitations under the License. 15* 16* This file has been modified by Huawei to verify type inference by adding verification statements. 17*/ 18 19// === tests/cases/compiler/discriminantsAndNullOrUndefined.ts === 20declare function AssertType(value:any, type:string):void; 21// Repro from #10228 22 23interface A { kind: 'A'; } 24interface B { kind: 'B'; } 25 26type C = A | B | undefined; 27 28function never(_: never): never { 29 throw new Error(); 30AssertType(new Error(), "Error"); 31AssertType(Error, "ErrorConstructor"); 32} 33 34function useA(_: A): void { } 35function useB(_: B): void { } 36 37declare let c: C; 38AssertType(c, "C"); 39 40if (c !== undefined) { 41 switch (c.kind) { 42AssertType(c.kind, "union"); 43 44 case 'A': useA(c); break; 45AssertType('A', "string"); 46AssertType(useA(c), "void"); 47AssertType(useA, "(A) => void"); 48AssertType(c, "A"); 49 50 case 'B': useB(c); break; 51AssertType('B', "string"); 52AssertType(useB(c), "void"); 53AssertType(useB, "(B) => void"); 54AssertType(c, "B"); 55 56 default: never(c); 57AssertType(never(c), "never"); 58AssertType(never, "(never) => never"); 59AssertType(c, "never"); 60 } 61} 62 63