1/* 2 * Copyright (c) 2024 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 16class C<T> { 17 constructor (p: T) { this.v = p; } 18 v : T; 19} 20 21type Alias1Function<T> = (p : T) => double; 22type Alias2Function<T> = (p : double) => T; 23type Alias3Function<T> = (p : Int) => T[]; 24type Alias4Function<T> = (p : T[], q: T) => double; 25type Alias5Function<T1, T2> = (p : T1[], q: T2) => double; 26type Alias6Function<T1, T2, R> = (p : T1, q: T2) => R; 27type Alias7Function<T> = (p : (p1 : C<T>) => double, q : double) => double; 28 29function main() { 30 let v1 : (p : double) => double = (p : double) : double => { return p; }; // (p:Double) => Double 31 assert(v1(1) == 1); 32 33 let v2 : Alias1Function<double> = (p : double) : double => { return p; }; // (p:Double) => Double 34 assert(v2(2) == 2); 35 36 let v3 : Alias2Function<double> = (p : double) : double => { return p; }; // (p:Double) => Double 37 assert(v3(3) == 3); 38 39 let v4 : Alias3Function<double> = (p : Int) : double[] => { return [p]; }; // (p:Double) => double[] 40 assert(v4(4)[0] == 4); 41 42 // let v5 : Alias4Function<double> = (p : double[], q: double) : double => { return p[0]; }; // (p: Double[], q: Double) => Double 43 // assert(v5([5.0], 6) == 5); 44 45 let v6 : Alias5Function<double, double> = (p : double[], q: double) : double => { return p[0]; }; // (p: double[], q: Double) => Double 46 assert(v6([7.0], 8) == 7.0); 47 48 let v7 : Alias6Function<double, double, double> = (p: double, q: double) : double => { return p + q; }; // (p: Double, q: Double) => Double 49 assert(v7(9, 10) == 19); 50 51 let v9 : Alias7Function<double> = (p : (p1 : C<double>) => double, q: double) : double => { return p(new C<double>(q)); }; // (p : (p1 : C<Double) => Double, Double) : Double 52 assert(v9((p : C<double>) : double => { return p.v;}, 20) == 20); 53} 54