13af6ab5fSopenharmony_ci/*
23af6ab5fSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
33af6ab5fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43af6ab5fSopenharmony_ci * you may not use this file except in compliance with the License.
53af6ab5fSopenharmony_ci * You may obtain a copy of the License at
63af6ab5fSopenharmony_ci *
73af6ab5fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
83af6ab5fSopenharmony_ci *
93af6ab5fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103af6ab5fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113af6ab5fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123af6ab5fSopenharmony_ci * See the License for the specific language governing permissions and
133af6ab5fSopenharmony_ci * limitations under the License.
143af6ab5fSopenharmony_ci */
153af6ab5fSopenharmony_ci
163af6ab5fSopenharmony_ci
173af6ab5fSopenharmony_cifunction func1<Type, A, B extends readonly number[]>(arg: Type): Type {
183af6ab5fSopenharmony_ci    return arg;
193af6ab5fSopenharmony_ci}
203af6ab5fSopenharmony_ci
213af6ab5fSopenharmony_cifunction func2<A extends { a: number, b: string }>() { }
223af6ab5fSopenharmony_ci
233af6ab5fSopenharmony_cifunction func3<A extends keyof { a: { b: number, c: boolean }, b: [number, string] }>(a: A, b: string): number | boolean {
243af6ab5fSopenharmony_ci    return true;
253af6ab5fSopenharmony_ci}
263af6ab5fSopenharmony_ci
273af6ab5fSopenharmony_cideclare type PromiseConstructorLike = new <T>(executor: (resolve: (value: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void) => PromiseLike<T>;
283af6ab5fSopenharmony_ci
293af6ab5fSopenharmony_ciinterface R<K extends [number, string], T = string> {
303af6ab5fSopenharmony_ci    a: number,
313af6ab5fSopenharmony_ci    [x: string]: boolean | number,
323af6ab5fSopenharmony_ci}
333af6ab5fSopenharmony_ci
343af6ab5fSopenharmony_ciinterface U<A extends readonly [number, number, { a: number, b: string }], Z = boolean> extends R<[number, string]> {
353af6ab5fSopenharmony_ci    <A>(): number,
363af6ab5fSopenharmony_ci    o<A extends number>(): [boolean, number[]];
373af6ab5fSopenharmony_ci}
383af6ab5fSopenharmony_ci
393af6ab5fSopenharmony_cifunc1<number, string, [1, 2, 3]>()
403af6ab5fSopenharmony_cifunc2<<A>() => {}>();
413af6ab5fSopenharmony_ci
423af6ab5fSopenharmony_civar o = {
433af6ab5fSopenharmony_ci    a: function <B, C extends typeof func1>() { },
443af6ab5fSopenharmony_ci    b: function <D = number, T = string>() { },
453af6ab5fSopenharmony_ci    c<E, F extends readonly []>() { }
463af6ab5fSopenharmony_ci}
473af6ab5fSopenharmony_ci
483af6ab5fSopenharmony_ciclass A<T extends B, Z = { a: number, b: string }> {
493af6ab5fSopenharmony_ci    public a<T, R>() { };
503af6ab5fSopenharmony_ci    private b<E extends (a: number, b: string) => any[]>() { }
513af6ab5fSopenharmony_ci}
523af6ab5fSopenharmony_ci
533af6ab5fSopenharmony_ciclass W extends T<<B> () => number, [number | string][]> {
543af6ab5fSopenharmony_ci
553af6ab5fSopenharmony_ci}
563af6ab5fSopenharmony_ci
573af6ab5fSopenharmony_ciclass X extends Q<number> implements S<<R>(a:number, b:string) => [number]>, A {
583af6ab5fSopenharmony_ci
593af6ab5fSopenharmony_ci}
603af6ab5fSopenharmony_ci
613af6ab5fSopenharmony_civar a: new <A>() => <B>() => string;
623af6ab5fSopenharmony_civar b: <A extends T, U = 5>(a: number | string) => { a: number };
633af6ab5fSopenharmony_ci
643af6ab5fSopenharmony_civar c: B.T<A<C<number>>>[0];
653af6ab5fSopenharmony_civar d: A<number, { a: number, b: string }, [number, string]>;
663af6ab5fSopenharmony_civar e: T<<A>() => {}>;
673af6ab5fSopenharmony_ci
683af6ab5fSopenharmony_citype E<R extends B, C, T = number> = number | T | string;
693af6ab5fSopenharmony_citype P<K, Q = [number, number, string] | any[]> = {a:K, b:Q};
703af6ab5fSopenharmony_ci
713af6ab5fSopenharmony_ciasync<<A>() => {}>();
723af6ab5fSopenharmony_cip<number>();
733af6ab5fSopenharmony_ci<A extends B>():number => true;
743af6ab5fSopenharmony_ciasync<A extends readonly [number, string]>() => {return "foo";};
75