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/conformance/types/rest/objectRestAssignment.ts === 20declare function AssertType(value:any, type:string):void; 21let ka: any; 22AssertType(ka, "any"); 23 24let nested: { ki }; 25AssertType(nested, "{ ki: any; }"); 26AssertType(ki, "any"); 27 28let other: number; 29AssertType(other, "number"); 30 31let rest: { }; 32AssertType(rest, "{}"); 33 34let complex: { x: { ka, ki }, y: number }; 35AssertType(complex, "{ x: { ka; ki;}; y: number; }"); 36AssertType(x, "{ ka: any; ki: any; }"); 37AssertType(ka, "any"); 38AssertType(ki, "any"); 39AssertType(y, "number"); 40 41({x: { ka, ...nested }, y: other, ...rest} = complex); 42AssertType(({x: { ka, ...nested }, y: other, ...rest} = complex), "{ x: { ka: any; ki: any; }; y: number; }"); 43AssertType({x: { ka, ...nested }, y: other, ...rest} = complex, "{ x: { ka: any; ki: any; }; y: number; }"); 44AssertType({x: { ka, ...nested }, y: other, ...rest}, "{ x: { ki: any; ka: any; }; y: number; }"); 45AssertType(x, "{ ki: any; ka: any; }"); 46AssertType({ ka, ...nested }, "{ ki: any; ka: any; }"); 47AssertType(ka, "any"); 48AssertType(nested, "{ ki: any; }"); 49AssertType(y, "number"); 50AssertType(other, "number"); 51AssertType(rest, "{}"); 52AssertType(complex, "{ x: { ka: any; ki: any; }; y: number; }"); 53 54// should be: 55let overEmit: { a: { ka: string, x: string }[], b: { z: string, ki: string, ku: string }, ke: string, ko: string }; 56AssertType(overEmit, "{ a: { ka: string; x: string;}[]; b: { z: string; ki: string; ku: string;}; ke: string; ko: string; }"); 57AssertType(a, "{ ka: string; x: string; }[]"); 58AssertType(ka, "string"); 59AssertType(x, "string"); 60AssertType(b, "{ z: string; ki: string; ku: string; }"); 61AssertType(z, "string"); 62AssertType(ki, "string"); 63AssertType(ku, "string"); 64AssertType(ke, "string"); 65AssertType(ko, "string"); 66 67let { a: [{ ...nested2 }, ...y], b: { z, ...c }, ...rest2 } = overEmit; 68AssertType(a, "any"); 69AssertType(nested2, "{ ka: string; x: string; }"); 70AssertType(y, "{ ka: string; x: string; }[]"); 71AssertType(b, "any"); 72AssertType(z, "string"); 73AssertType(c, "{ ki: string; ku: string; }"); 74AssertType(rest2, "{ ke: string; ko: string; }"); 75AssertType(overEmit, "{ a: { ka: string; x: string; }[]; b: { z: string; ki: string; ku: string; }; ke: string; ko: string; }"); 76 77({ a: [{ ...nested2 }, ...y], b: { z, ...c }, ...rest2 } = overEmit); 78AssertType(({ a: [{ ...nested2 }, ...y], b: { z, ...c }, ...rest2 } = overEmit), "{ a: { ka: string; x: string; }[]; b: { z: string; ki: string; ku: string; }; ke: string; ko: string; }"); 79AssertType({ a: [{ ...nested2 }, ...y], b: { z, ...c }, ...rest2 } = overEmit, "{ a: { ka: string; x: string; }[]; b: { z: string; ki: string; ku: string; }; ke: string; ko: string; }"); 80AssertType({ a: [{ ...nested2 }, ...y], b: { z, ...c }, ...rest2 }, "{ ke: string; ko: string; a: [{ ka: string; x: string; }, ...{ ka: string; x: string; }[]]; b: { ki: string; ku: string; z: string; }; }"); 81AssertType(a, "[{ ka: string; x: string; }, ...{ ka: string; x: string; }[]]"); 82AssertType([{ ...nested2 }, ...y], "[{ ka: string; x: string; }, ...{ ka: string; x: string; }[]]"); 83AssertType({ ...nested2 }, "{ ka: string; x: string; }"); 84AssertType(nested2, "{ ka: string; x: string; }"); 85AssertType(...y, "{ ka: string; x: string; }"); 86AssertType(y, "{ ka: string; x: string; }[]"); 87AssertType(b, "{ ki: string; ku: string; z: string; }"); 88AssertType({ z, ...c }, "{ ki: string; ku: string; z: string; }"); 89AssertType(z, "string"); 90AssertType(c, "{ ki: string; ku: string; }"); 91AssertType(rest2, "{ ke: string; ko: string; }"); 92AssertType(overEmit, "{ a: { ka: string; x: string; }[]; b: { z: string; ki: string; ku: string; }; ke: string; ko: string; }"); 93 94 95