1/* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 17type X7_T1 = T7<{ a: "a", b: "b" }>; // ["string", "a" | "b"] 18type X7_T2 = T7<{ a: 1, b: 2 }>; // ["number", 1 | 2] 19type X7_T3 = T7<{ a: object, b: object }>; // never 20type X7_T4 = T7<{ a: "a", b: 1 }>; // never 21 22// infer twice with missing second constraint (same behavior as class/interface) 23type T8<T> = 24 T extends { a: infer U extends string, b: infer U } ? ["string", U] : 25 T extends { a: infer U extends number, b: infer U } ? ["number", U] : 26 never; 27 28type X8_T1 = T8<{ a: "a", b: "b" }>; // ["string", "a" | "b"] 29type X8_T2 = T8<{ a: 1, b: 2 }>; // ["number", 1 | 2] 30type X8_T3 = T8<{ a: object, b: object }>; // never 31type X8_T4 = T8<{ a: "a", b: 1 }>; // never 32 33// infer twice with missing first constraint (same behavior as class/interface) 34type T9<T> = 35 T extends { a: infer U, b: infer U extends string } ? ["string", U] : 36 T extends { a: infer U, b: infer U extends number } ? ["number", U] : 37 never; 38 39type X9_T1 = T9<{ a: "a", b: "b" }>; // ["string", "a" | "b"] 40type X9_T2 = T9<{ a: 1, b: 2 }>; // ["number", 1 | 2] 41type X9_T3 = T9<{ a: object, b: object }>; // never 42type X9_T4 = T9<{ a: "a", b: 1 }>; // never 43