13af6ab5fSopenharmony_ci.. Copyright (c) 2021-2024 Huawei Device Co., Ltd. 23af6ab5fSopenharmony_ci Licensed under the Apache License, Version 2.0 (the "License"); 33af6ab5fSopenharmony_ci you may not use this file except in compliance with the License. 43af6ab5fSopenharmony_ci You may obtain a copy of the License at 53af6ab5fSopenharmony_ci http://www.apache.org/licenses/LICENSE-2.0 63af6ab5fSopenharmony_ci Unless required by applicable law or agreed to in writing, software 73af6ab5fSopenharmony_ci distributed under the License is distributed on an "AS IS" BASIS, 83af6ab5fSopenharmony_ci WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 93af6ab5fSopenharmony_ci See the License for the specific language governing permissions and 103af6ab5fSopenharmony_ci limitations under the License. 113af6ab5fSopenharmony_ci 123af6ab5fSopenharmony_ciRecipes 133af6ab5fSopenharmony_ci======= 143af6ab5fSopenharmony_ci 153af6ab5fSopenharmony_ci.. _R001: 163af6ab5fSopenharmony_ci 173af6ab5fSopenharmony_ci|CB_R| #1: Objects with property names that are not identifiers are not supported 183af6ab5fSopenharmony_ci--------------------------------------------------------------------------------- 193af6ab5fSopenharmony_ci 203af6ab5fSopenharmony_ci|CB_RULE| 213af6ab5fSopenharmony_ci~~~~~~~~~ 223af6ab5fSopenharmony_ci 233af6ab5fSopenharmony_ci|LANG| does not support Objects with name properties that are numbers or 243af6ab5fSopenharmony_cistrings. Use classes to access data by property names. Use arrays to access data 253af6ab5fSopenharmony_ciby numeric indices. 263af6ab5fSopenharmony_ci 273af6ab5fSopenharmony_ci|CB_BAD| 283af6ab5fSopenharmony_ci~~~~~~~~ 293af6ab5fSopenharmony_ci 303af6ab5fSopenharmony_ci.. code-block:: typescript 313af6ab5fSopenharmony_ci 323af6ab5fSopenharmony_ci var x = {"name": 1, 2: 3} 333af6ab5fSopenharmony_ci 343af6ab5fSopenharmony_ci console.log(x["name"]) 353af6ab5fSopenharmony_ci console.log(x[2]) 363af6ab5fSopenharmony_ci 373af6ab5fSopenharmony_ci|CB_OK| 383af6ab5fSopenharmony_ci~~~~~~~ 393af6ab5fSopenharmony_ci 403af6ab5fSopenharmony_ci.. code-block:: typescript 413af6ab5fSopenharmony_ci 423af6ab5fSopenharmony_ci class X { 433af6ab5fSopenharmony_ci public name: number 443af6ab5fSopenharmony_ci } 453af6ab5fSopenharmony_ci let x = {name: 1} 463af6ab5fSopenharmony_ci console.log(x.name) 473af6ab5fSopenharmony_ci 483af6ab5fSopenharmony_ci let y = [1, 2, 3] 493af6ab5fSopenharmony_ci console.log(y[2]) 503af6ab5fSopenharmony_ci 513af6ab5fSopenharmony_ci // If you still need a container to store keys of different types, 523af6ab5fSopenharmony_ci // use Map<Object, some_type>: 533af6ab5fSopenharmony_ci let z = new Map<Object, number>() 543af6ab5fSopenharmony_ci z.set("name", 1) 553af6ab5fSopenharmony_ci z.set(2, 2) 563af6ab5fSopenharmony_ci console.log(z.get("name")) 573af6ab5fSopenharmony_ci console.log(z.get(2)) 583af6ab5fSopenharmony_ci 593af6ab5fSopenharmony_ci|CB_SEE| 603af6ab5fSopenharmony_ci~~~~~~~~ 613af6ab5fSopenharmony_ci 623af6ab5fSopenharmony_ci* :ref:`R002` 633af6ab5fSopenharmony_ci* :ref:`R052` 643af6ab5fSopenharmony_ci* :ref:`R059` 653af6ab5fSopenharmony_ci* :ref:`R060` 663af6ab5fSopenharmony_ci* :ref:`R066` 673af6ab5fSopenharmony_ci* :ref:`R105` 683af6ab5fSopenharmony_ci* :ref:`R109` 693af6ab5fSopenharmony_ci 703af6ab5fSopenharmony_ci.. _R002: 713af6ab5fSopenharmony_ci 723af6ab5fSopenharmony_ci|CB_R| #2: ``Symbol()`` API is not supported 733af6ab5fSopenharmony_ci-------------------------------------------- 743af6ab5fSopenharmony_ci 753af6ab5fSopenharmony_ci|CB_RULE| 763af6ab5fSopenharmony_ci~~~~~~~~~ 773af6ab5fSopenharmony_ci 783af6ab5fSopenharmony_ci|LANG| does not support ``Symbol()`` API. 793af6ab5fSopenharmony_ci 803af6ab5fSopenharmony_ci|CB_BAD| 813af6ab5fSopenharmony_ci~~~~~~~~ 823af6ab5fSopenharmony_ci 833af6ab5fSopenharmony_ci|TS| has ``Symbol()`` API, which can be used among other things to generate 843af6ab5fSopenharmony_ciunique property names at runtime: 853af6ab5fSopenharmony_ci 863af6ab5fSopenharmony_ci.. code-block:: typescript 873af6ab5fSopenharmony_ci 883af6ab5fSopenharmony_ci const sym = Symbol() 893af6ab5fSopenharmony_ci let o = { 903af6ab5fSopenharmony_ci [sym]: "value" 913af6ab5fSopenharmony_ci } 923af6ab5fSopenharmony_ci 933af6ab5fSopenharmony_ci|CB_OK| 943af6ab5fSopenharmony_ci~~~~~~~ 953af6ab5fSopenharmony_ci 963af6ab5fSopenharmony_ci|LANG| does not support ``Symbol()`` API because its most popular use cases 973af6ab5fSopenharmony_cimake no sense in the statically typed environment. In particular, the object 983af6ab5fSopenharmony_cilayout is defined at compile time and cannot be changed at runtime. 993af6ab5fSopenharmony_ci 1003af6ab5fSopenharmony_ci|CB_SEE| 1013af6ab5fSopenharmony_ci~~~~~~~~ 1023af6ab5fSopenharmony_ci 1033af6ab5fSopenharmony_ci* :ref:`R001` 1043af6ab5fSopenharmony_ci* :ref:`R052` 1053af6ab5fSopenharmony_ci* :ref:`R059` 1063af6ab5fSopenharmony_ci* :ref:`R060` 1073af6ab5fSopenharmony_ci* :ref:`R066` 1083af6ab5fSopenharmony_ci* :ref:`R105` 1093af6ab5fSopenharmony_ci* :ref:`R109` 1103af6ab5fSopenharmony_ci 1113af6ab5fSopenharmony_ci.. _R003: 1123af6ab5fSopenharmony_ci 1133af6ab5fSopenharmony_ci|CB_R| #3: Private '#' identifiers are not supported 1143af6ab5fSopenharmony_ci---------------------------------------------------- 1153af6ab5fSopenharmony_ci 1163af6ab5fSopenharmony_ci|CB_RULE| 1173af6ab5fSopenharmony_ci~~~~~~~~~ 1183af6ab5fSopenharmony_ci 1193af6ab5fSopenharmony_ci|LANG| does not private identifiers started with ``#`` symbol, use ``private`` keyword instead. 1203af6ab5fSopenharmony_ci 1213af6ab5fSopenharmony_ci|CB_BAD| 1223af6ab5fSopenharmony_ci~~~~~~~~ 1233af6ab5fSopenharmony_ci 1243af6ab5fSopenharmony_ci.. code-block:: typescript 1253af6ab5fSopenharmony_ci 1263af6ab5fSopenharmony_ci class C { 1273af6ab5fSopenharmony_ci foo = 1 1283af6ab5fSopenharmony_ci } 1293af6ab5fSopenharmony_ci 1303af6ab5fSopenharmony_ci|CB_OK| 1313af6ab5fSopenharmony_ci~~~~~~~ 1323af6ab5fSopenharmony_ci 1333af6ab5fSopenharmony_ci.. code-block:: typescript 1343af6ab5fSopenharmony_ci 1353af6ab5fSopenharmony_ci class C { 1363af6ab5fSopenharmony_ci private foo = 1 1373af6ab5fSopenharmony_ci } 1383af6ab5fSopenharmony_ci 1393af6ab5fSopenharmony_ci 1403af6ab5fSopenharmony_ci.. _R004: 1413af6ab5fSopenharmony_ci 1423af6ab5fSopenharmony_ci|CB_R| #4: Use unique names for types, namespaces, etc. 1433af6ab5fSopenharmony_ci------------------------------------------------------- 1443af6ab5fSopenharmony_ci 1453af6ab5fSopenharmony_ci|CB_RULE| 1463af6ab5fSopenharmony_ci~~~~~~~~~ 1473af6ab5fSopenharmony_ci 1483af6ab5fSopenharmony_ciNames for types, namespaces and so on must be unique and distinct from other 1493af6ab5fSopenharmony_cinames, e.g., variable names. 1503af6ab5fSopenharmony_ci 1513af6ab5fSopenharmony_ci|CB_BAD| 1523af6ab5fSopenharmony_ci~~~~~~~~ 1533af6ab5fSopenharmony_ci 1543af6ab5fSopenharmony_ci.. code-block:: typescript 1553af6ab5fSopenharmony_ci 1563af6ab5fSopenharmony_ci let X: string 1573af6ab5fSopenharmony_ci type X = number[] // Type alias with the same name as the variable 1583af6ab5fSopenharmony_ci 1593af6ab5fSopenharmony_ci|CB_OK| 1603af6ab5fSopenharmony_ci~~~~~~~ 1613af6ab5fSopenharmony_ci 1623af6ab5fSopenharmony_ci.. code-block:: typescript 1633af6ab5fSopenharmony_ci 1643af6ab5fSopenharmony_ci let X: string 1653af6ab5fSopenharmony_ci type T = number[] // X is not allowed here to avoid name collisions 1663af6ab5fSopenharmony_ci 1673af6ab5fSopenharmony_ci.. _R005: 1683af6ab5fSopenharmony_ci 1693af6ab5fSopenharmony_ci|CB_R| #5: Use ``let`` instead of ``var`` 1703af6ab5fSopenharmony_ci----------------------------------------- 1713af6ab5fSopenharmony_ci 1723af6ab5fSopenharmony_ci|CB_RULE| 1733af6ab5fSopenharmony_ci~~~~~~~~~ 1743af6ab5fSopenharmony_ci 1753af6ab5fSopenharmony_ci|LANG| does not support ``var``, always use ``let`` instead. 1763af6ab5fSopenharmony_ci 1773af6ab5fSopenharmony_ci|CB_BAD| 1783af6ab5fSopenharmony_ci~~~~~~~~ 1793af6ab5fSopenharmony_ci 1803af6ab5fSopenharmony_ci.. code-block:: typescript 1813af6ab5fSopenharmony_ci 1823af6ab5fSopenharmony_ci function f(shouldInitialize: boolean) { 1833af6ab5fSopenharmony_ci if (shouldInitialize) { 1843af6ab5fSopenharmony_ci var x = 10 1853af6ab5fSopenharmony_ci } 1863af6ab5fSopenharmony_ci return x 1873af6ab5fSopenharmony_ci } 1883af6ab5fSopenharmony_ci 1893af6ab5fSopenharmony_ci console.log(f(true)) // 10 1903af6ab5fSopenharmony_ci console.log(f(false)) // undefined 1913af6ab5fSopenharmony_ci 1923af6ab5fSopenharmony_ci let upper_let = 0 1933af6ab5fSopenharmony_ci { 1943af6ab5fSopenharmony_ci var scoped_var = 0 1953af6ab5fSopenharmony_ci let scoped_let = 0 1963af6ab5fSopenharmony_ci upper_let = 5 1973af6ab5fSopenharmony_ci } 1983af6ab5fSopenharmony_ci scoped_var = 5 // Visible 1993af6ab5fSopenharmony_ci scoped_let = 5 // Compile-time error 2003af6ab5fSopenharmony_ci 2013af6ab5fSopenharmony_ci|CB_OK| 2023af6ab5fSopenharmony_ci~~~~~~~ 2033af6ab5fSopenharmony_ci 2043af6ab5fSopenharmony_ci.. code-block:: typescript 2053af6ab5fSopenharmony_ci 2063af6ab5fSopenharmony_ci function f(shouldInitialize: boolean): Object { 2073af6ab5fSopenharmony_ci let x: Object = new Object(); 2083af6ab5fSopenharmony_ci if (shouldInitialize) { 2093af6ab5fSopenharmony_ci x = 10 2103af6ab5fSopenharmony_ci } 2113af6ab5fSopenharmony_ci return x 2123af6ab5fSopenharmony_ci } 2133af6ab5fSopenharmony_ci 2143af6ab5fSopenharmony_ci console.log(f(true)); // 10 2153af6ab5fSopenharmony_ci console.log(f(false)); // {} 2163af6ab5fSopenharmony_ci 2173af6ab5fSopenharmony_ci let upper_let = 0 2183af6ab5fSopenharmony_ci let scoped_var = 0 2193af6ab5fSopenharmony_ci { 2203af6ab5fSopenharmony_ci let scoped_let = 0 2213af6ab5fSopenharmony_ci upper_let = 5 2223af6ab5fSopenharmony_ci } 2233af6ab5fSopenharmony_ci scoped_var = 5 2243af6ab5fSopenharmony_ci scoped_let = 5 // Compile-time error 2253af6ab5fSopenharmony_ci 2263af6ab5fSopenharmony_ci.. _R008: 2273af6ab5fSopenharmony_ci 2283af6ab5fSopenharmony_ci|CB_R| #8: Use explicit types instead of ``any``, ``undefined``, ``unknown`` 2293af6ab5fSopenharmony_ci---------------------------------------------------------------------------- 2303af6ab5fSopenharmony_ci 2313af6ab5fSopenharmony_ci|CB_RULE| 2323af6ab5fSopenharmony_ci~~~~~~~~~ 2333af6ab5fSopenharmony_ci 2343af6ab5fSopenharmony_ci|LANG| does not support ``any``, ``undefined``, and ``unknown`` types. 2353af6ab5fSopenharmony_ciSpecify types explicitly. 2363af6ab5fSopenharmony_ci 2373af6ab5fSopenharmony_ci|CB_BAD| 2383af6ab5fSopenharmony_ci~~~~~~~~ 2393af6ab5fSopenharmony_ci 2403af6ab5fSopenharmony_ci.. code-block:: typescript 2413af6ab5fSopenharmony_ci 2423af6ab5fSopenharmony_ci var x 2433af6ab5fSopenharmony_ci console.log(x) // undefined 2443af6ab5fSopenharmony_ci 2453af6ab5fSopenharmony_ci var y: any 2463af6ab5fSopenharmony_ci console.log(y) // undefined 2473af6ab5fSopenharmony_ci 2483af6ab5fSopenharmony_ci|CB_OK| 2493af6ab5fSopenharmony_ci~~~~~~~ 2503af6ab5fSopenharmony_ci 2513af6ab5fSopenharmony_ci.. code-block:: typescript 2523af6ab5fSopenharmony_ci 2533af6ab5fSopenharmony_ci // All variables should have their types specified explicitly: 2543af6ab5fSopenharmony_ci let x: Object = {} 2553af6ab5fSopenharmony_ci console.log(x) // {} 2563af6ab5fSopenharmony_ci 2573af6ab5fSopenharmony_ci|CB_SEE| 2583af6ab5fSopenharmony_ci~~~~~~~~ 2593af6ab5fSopenharmony_ci 2603af6ab5fSopenharmony_ci.. _R009: 2613af6ab5fSopenharmony_ci 2623af6ab5fSopenharmony_ci|CB_R| #9: You can extend your |TS| code with more numeric types 2633af6ab5fSopenharmony_ci---------------------------------------------------------------- 2643af6ab5fSopenharmony_ci 2653af6ab5fSopenharmony_ci|CB_RULE| 2663af6ab5fSopenharmony_ci~~~~~~~~~ 2673af6ab5fSopenharmony_ci 2683af6ab5fSopenharmony_ci|LANG| supports different numeric types on top of just ``number``. 2693af6ab5fSopenharmony_ci 2703af6ab5fSopenharmony_ci|CB_BAD| 2713af6ab5fSopenharmony_ci~~~~~~~~ 2723af6ab5fSopenharmony_ci 2733af6ab5fSopenharmony_ci|TS| supports ``number`` as the only numeric type: 2743af6ab5fSopenharmony_ci 2753af6ab5fSopenharmony_ci.. code-block:: typescript 2763af6ab5fSopenharmony_ci 2773af6ab5fSopenharmony_ci let x: number = 1 2783af6ab5fSopenharmony_ci 2793af6ab5fSopenharmony_ci|CB_OK| 2803af6ab5fSopenharmony_ci~~~~~~~ 2813af6ab5fSopenharmony_ci 2823af6ab5fSopenharmony_ci|LANG| supports several numeric types: 2833af6ab5fSopenharmony_ci 2843af6ab5fSopenharmony_ci+-----------+----------+-------------------------------------------------------------+ 2853af6ab5fSopenharmony_ci| Type | Size | Range | 2863af6ab5fSopenharmony_ci+===========+==========+=============================================================+ 2873af6ab5fSopenharmony_ci|``byte`` | 8 bits |``[-128 .. 127]`` | 2883af6ab5fSopenharmony_ci+-----------+----------+-------------------------------------------------------------+ 2893af6ab5fSopenharmony_ci|``short`` | 16 bits |``[-32,768 .. 32,767]`` | 2903af6ab5fSopenharmony_ci+-----------+----------+-------------------------------------------------------------+ 2913af6ab5fSopenharmony_ci|``int`` | 32 bits |``[-2,147,483,648 .. 2,147,483,647]`` | 2923af6ab5fSopenharmony_ci+-----------+----------+-------------------------------------------------------------+ 2933af6ab5fSopenharmony_ci|``long`` | 64 bits |``[-9,223,372,036,854,775,808 .. 9,223,372,036,854,775,807]``| 2943af6ab5fSopenharmony_ci+-----------+----------+-------------------------------------------------------------+ 2953af6ab5fSopenharmony_ci|``ubyte`` | 8 bits |``[0 .. 255]`` | 2963af6ab5fSopenharmony_ci+-----------+----------+-------------------------------------------------------------+ 2973af6ab5fSopenharmony_ci|``ushort`` | 16 bits |``[0 .. 65,535]`` | 2983af6ab5fSopenharmony_ci+-----------+----------+-------------------------------------------------------------+ 2993af6ab5fSopenharmony_ci|``uint`` | 32 bits |``[0 .. 4,294,967,295]`` | 3003af6ab5fSopenharmony_ci+-----------+----------+-------------------------------------------------------------+ 3013af6ab5fSopenharmony_ci|``ulong`` | 64 bits |``[0 .. 18,446,744,073,709,551,615]`` | 3023af6ab5fSopenharmony_ci+-----------+----------+-------------------------------------------------------------+ 3033af6ab5fSopenharmony_ci|``float`` | 32 bits |``3.4E +/- 38 (7 digits)`` | 3043af6ab5fSopenharmony_ci+-----------+----------+-------------------------------------------------------------+ 3053af6ab5fSopenharmony_ci|``double`` | 64 bits |``1.7E +/- 308 (15 digits)`` | 3063af6ab5fSopenharmony_ci+-----------+----------+-------------------------------------------------------------+ 3073af6ab5fSopenharmony_ci 3083af6ab5fSopenharmony_ciAdditionally, |LANG| supports the following types: 3093af6ab5fSopenharmony_ci 3103af6ab5fSopenharmony_ci* Character type ``char`` (the range of values is the same as ``ushort``) 3113af6ab5fSopenharmony_ci* Boolean type ``boolean`` (values: ``true``, ``false``) 3123af6ab5fSopenharmony_ci 3133af6ab5fSopenharmony_ci.. code-block:: typescript 3143af6ab5fSopenharmony_ci 3153af6ab5fSopenharmony_ci let x: int = 1 3163af6ab5fSopenharmony_ci let y: boolean = true 3173af6ab5fSopenharmony_ci let z: char = 'a' 3183af6ab5fSopenharmony_ci 3193af6ab5fSopenharmony_ci.. _R010: 3203af6ab5fSopenharmony_ci 3213af6ab5fSopenharmony_ci|CB_R| #10: Use ``long`` instead of ``bigint`` 3223af6ab5fSopenharmony_ci---------------------------------------------- 3233af6ab5fSopenharmony_ci 3243af6ab5fSopenharmony_ci|CB_RULE| 3253af6ab5fSopenharmony_ci~~~~~~~~~ 3263af6ab5fSopenharmony_ci 3273af6ab5fSopenharmony_ciUse ``long`` to work with 64-bit integers. 3283af6ab5fSopenharmony_ci 3293af6ab5fSopenharmony_ci|CB_BAD| 3303af6ab5fSopenharmony_ci~~~~~~~~ 3313af6ab5fSopenharmony_ci 3323af6ab5fSopenharmony_ci|TS| supports ``bigint`` data type, but this feature is available only since 3333af6ab5fSopenharmony_ciES2020 and requires ``n`` suffix for numeric literals: 3343af6ab5fSopenharmony_ci 3353af6ab5fSopenharmony_ci.. code-block:: typescript 3363af6ab5fSopenharmony_ci 3373af6ab5fSopenharmony_ci let a: bigint = 1n 3383af6ab5fSopenharmony_ci 3393af6ab5fSopenharmony_ci|CB_OK| 3403af6ab5fSopenharmony_ci~~~~~~~ 3413af6ab5fSopenharmony_ci 3423af6ab5fSopenharmony_ci|LANG| provides ``long`` data type to work with 64-bit 3433af6ab5fSopenharmony_ciintegers, ``n`` suffix is not supported: 3443af6ab5fSopenharmony_ci 3453af6ab5fSopenharmony_ci.. code-block:: typescript 3463af6ab5fSopenharmony_ci 3473af6ab5fSopenharmony_ci let x: long = 1 3483af6ab5fSopenharmony_ci 3493af6ab5fSopenharmony_ci.. _R012: 3503af6ab5fSopenharmony_ci 3513af6ab5fSopenharmony_ci|CB_R| #12: Use ``T[]`` instead of ``Array<T>`` to declare arrays 3523af6ab5fSopenharmony_ci----------------------------------------------------------------- 3533af6ab5fSopenharmony_ci 3543af6ab5fSopenharmony_ci|CB_RULE| 3553af6ab5fSopenharmony_ci~~~~~~~~~ 3563af6ab5fSopenharmony_ci 3573af6ab5fSopenharmony_ciIn |TS|, arrays can be declared as either ``Array<T>`` or ``T[]``. Currently, 3583af6ab5fSopenharmony_ci|LANG| supports only the second syntax for array declaration. 3593af6ab5fSopenharmony_ci 3603af6ab5fSopenharmony_ci|CB_BAD| 3613af6ab5fSopenharmony_ci~~~~~~~~ 3623af6ab5fSopenharmony_ci 3633af6ab5fSopenharmony_ci.. code-block:: typescript 3643af6ab5fSopenharmony_ci 3653af6ab5fSopenharmony_ci // These are equivalent in TypeScript: 3663af6ab5fSopenharmony_ci let y: Array<string> = ["1", "2", "3"] 3673af6ab5fSopenharmony_ci 3683af6ab5fSopenharmony_ci|CB_OK| 3693af6ab5fSopenharmony_ci~~~~~~~ 3703af6ab5fSopenharmony_ci 3713af6ab5fSopenharmony_ci.. code-block:: typescript 3723af6ab5fSopenharmony_ci 3733af6ab5fSopenharmony_ci let x: string[] = ["1", "2", "3"]; 3743af6ab5fSopenharmony_ci let y: string[] = ["1", "2", "3"]; // Array<string> is not supported currently 3753af6ab5fSopenharmony_ci 3763af6ab5fSopenharmony_ci.. _R014: 3773af6ab5fSopenharmony_ci 3783af6ab5fSopenharmony_ci|CB_R| #14: Use ``class`` instead of a type with call signature 3793af6ab5fSopenharmony_ci--------------------------------------------------------------- 3803af6ab5fSopenharmony_ci 3813af6ab5fSopenharmony_ci|CB_RULE| 3823af6ab5fSopenharmony_ci~~~~~~~~~ 3833af6ab5fSopenharmony_ci 3843af6ab5fSopenharmony_ci|LANG| does not support call signatures in object types. Use classes instead. 3853af6ab5fSopenharmony_ci 3863af6ab5fSopenharmony_ci|CB_BAD| 3873af6ab5fSopenharmony_ci~~~~~~~~ 3883af6ab5fSopenharmony_ci 3893af6ab5fSopenharmony_ci.. code-block:: typescript 3903af6ab5fSopenharmony_ci 3913af6ab5fSopenharmony_ci type DescribableFunction = { 3923af6ab5fSopenharmony_ci description: string 3933af6ab5fSopenharmony_ci (someArg: number): string // call signature 3943af6ab5fSopenharmony_ci } 3953af6ab5fSopenharmony_ci 3963af6ab5fSopenharmony_ci function doSomething(fn: DescribableFunction): void { 3973af6ab5fSopenharmony_ci console.log(fn.description + " returned " + fn(6)) 3983af6ab5fSopenharmony_ci } 3993af6ab5fSopenharmony_ci 4003af6ab5fSopenharmony_ci|CB_OK| 4013af6ab5fSopenharmony_ci~~~~~~~ 4023af6ab5fSopenharmony_ci 4033af6ab5fSopenharmony_ci.. code-block:: typescript 4043af6ab5fSopenharmony_ci 4053af6ab5fSopenharmony_ci class DescribableFunction { 4063af6ab5fSopenharmony_ci description: string; 4073af6ab5fSopenharmony_ci public invoke(someArg: number): string { 4083af6ab5fSopenharmony_ci return someArg.toString() 4093af6ab5fSopenharmony_ci } 4103af6ab5fSopenharmony_ci constructor() { 4113af6ab5fSopenharmony_ci this.description = "desc" 4123af6ab5fSopenharmony_ci } 4133af6ab5fSopenharmony_ci } 4143af6ab5fSopenharmony_ci 4153af6ab5fSopenharmony_ci function doSomething(fn: DescribableFunction): void { 4163af6ab5fSopenharmony_ci console.log(fn.description + " returned " + fn.invoke(6)) 4173af6ab5fSopenharmony_ci } 4183af6ab5fSopenharmony_ci 4193af6ab5fSopenharmony_ci doSomething(new DescribableFunction()); 4203af6ab5fSopenharmony_ci 4213af6ab5fSopenharmony_ci|CB_SEE| 4223af6ab5fSopenharmony_ci~~~~~~~~ 4233af6ab5fSopenharmony_ci 4243af6ab5fSopenharmony_ci* :ref:`R015` 4253af6ab5fSopenharmony_ci 4263af6ab5fSopenharmony_ci.. _R015: 4273af6ab5fSopenharmony_ci 4283af6ab5fSopenharmony_ci|CB_R| #15: Use ``class`` instead of a type with constructor signature 4293af6ab5fSopenharmony_ci---------------------------------------------------------------------- 4303af6ab5fSopenharmony_ci 4313af6ab5fSopenharmony_ci|CB_RULE| 4323af6ab5fSopenharmony_ci~~~~~~~~~ 4333af6ab5fSopenharmony_ci 4343af6ab5fSopenharmony_ci|LANG| does not support constructor signatures in object types. Use classes 4353af6ab5fSopenharmony_ciinstead. 4363af6ab5fSopenharmony_ci 4373af6ab5fSopenharmony_ci|CB_BAD| 4383af6ab5fSopenharmony_ci~~~~~~~~ 4393af6ab5fSopenharmony_ci 4403af6ab5fSopenharmony_ci.. code-block:: typescript 4413af6ab5fSopenharmony_ci 4423af6ab5fSopenharmony_ci class SomeObject {} 4433af6ab5fSopenharmony_ci 4443af6ab5fSopenharmony_ci type SomeConstructor = { 4453af6ab5fSopenharmony_ci new (s: string): SomeObject 4463af6ab5fSopenharmony_ci } 4473af6ab5fSopenharmony_ci 4483af6ab5fSopenharmony_ci function fn(ctor: SomeConstructor) { 4493af6ab5fSopenharmony_ci return new ctor("hello"); 4503af6ab5fSopenharmony_ci } 4513af6ab5fSopenharmony_ci 4523af6ab5fSopenharmony_ci|CB_OK| 4533af6ab5fSopenharmony_ci~~~~~~~ 4543af6ab5fSopenharmony_ci 4553af6ab5fSopenharmony_ci.. code-block:: typescript 4563af6ab5fSopenharmony_ci 4573af6ab5fSopenharmony_ci class SomeObject { 4583af6ab5fSopenharmony_ci public f: string 4593af6ab5fSopenharmony_ci constructor (s: string) { 4603af6ab5fSopenharmony_ci this.f = s 4613af6ab5fSopenharmony_ci } 4623af6ab5fSopenharmony_ci } 4633af6ab5fSopenharmony_ci 4643af6ab5fSopenharmony_ci function fn(s: string): SomeObject { 4653af6ab5fSopenharmony_ci return new SomeObject(s) 4663af6ab5fSopenharmony_ci } 4673af6ab5fSopenharmony_ci 4683af6ab5fSopenharmony_ci|CB_SEE| 4693af6ab5fSopenharmony_ci~~~~~~~~ 4703af6ab5fSopenharmony_ci 4713af6ab5fSopenharmony_ci* :ref:`R014` 4723af6ab5fSopenharmony_ci 4733af6ab5fSopenharmony_ci.. _R016: 4743af6ab5fSopenharmony_ci 4753af6ab5fSopenharmony_ci|CB_R| #16: Only one static block is supported 4763af6ab5fSopenharmony_ci---------------------------------------------- 4773af6ab5fSopenharmony_ci 4783af6ab5fSopenharmony_ci|CB_RULE| 4793af6ab5fSopenharmony_ci~~~~~~~~~ 4803af6ab5fSopenharmony_ci 4813af6ab5fSopenharmony_ci|LANG| does not allow to have sevaral static block for class initialization, combine static blocks statements to the one static block. 4823af6ab5fSopenharmony_ci 4833af6ab5fSopenharmony_ci|CB_BAD| 4843af6ab5fSopenharmony_ci~~~~~~~~ 4853af6ab5fSopenharmony_ci 4863af6ab5fSopenharmony_ci.. code-block:: typescript 4873af6ab5fSopenharmony_ci 4883af6ab5fSopenharmony_ci class C { 4893af6ab5fSopenharmony_ci static s: string 4903af6ab5fSopenharmony_ci 4913af6ab5fSopenharmony_ci static { 4923af6ab5fSopenharmony_ci C.s = "aa" 4933af6ab5fSopenharmony_ci } 4943af6ab5fSopenharmony_ci static { 4953af6ab5fSopenharmony_ci C.s = C.s + "bb" 4963af6ab5fSopenharmony_ci } 4973af6ab5fSopenharmony_ci } 4983af6ab5fSopenharmony_ci 4993af6ab5fSopenharmony_ci|CB_OK| 5003af6ab5fSopenharmony_ci~~~~~~~ 5013af6ab5fSopenharmony_ci 5023af6ab5fSopenharmony_ci.. code-block:: typescript 5033af6ab5fSopenharmony_ci 5043af6ab5fSopenharmony_ci 5053af6ab5fSopenharmony_ci class C { 5063af6ab5fSopenharmony_ci static s: string 5073af6ab5fSopenharmony_ci 5083af6ab5fSopenharmony_ci static { 5093af6ab5fSopenharmony_ci C.s = "aa" 5103af6ab5fSopenharmony_ci C.s = C.s + "bb" 5113af6ab5fSopenharmony_ci } 5123af6ab5fSopenharmony_ci } 5133af6ab5fSopenharmony_ci 5143af6ab5fSopenharmony_ci 5153af6ab5fSopenharmony_ci.. _R017: 5163af6ab5fSopenharmony_ci 5173af6ab5fSopenharmony_ci|CB_R| #17: Indexed signatures are not supported 5183af6ab5fSopenharmony_ci------------------------------------------------ 5193af6ab5fSopenharmony_ci 5203af6ab5fSopenharmony_ci|CB_RULE| 5213af6ab5fSopenharmony_ci~~~~~~~~~ 5223af6ab5fSopenharmony_ci 5233af6ab5fSopenharmony_ci|LANG| does not allow indexed signatures, use arrays instead. 5243af6ab5fSopenharmony_ci 5253af6ab5fSopenharmony_ci|CB_BAD| 5263af6ab5fSopenharmony_ci~~~~~~~~ 5273af6ab5fSopenharmony_ci 5283af6ab5fSopenharmony_ci.. code-block:: typescript 5293af6ab5fSopenharmony_ci 5303af6ab5fSopenharmony_ci // Interface with an indexed signature: 5313af6ab5fSopenharmony_ci interface StringArray { 5323af6ab5fSopenharmony_ci [index: number]: string 5333af6ab5fSopenharmony_ci } 5343af6ab5fSopenharmony_ci 5353af6ab5fSopenharmony_ci const myArray: StringArray = getStringArray() 5363af6ab5fSopenharmony_ci const secondItem = myArray[1] 5373af6ab5fSopenharmony_ci 5383af6ab5fSopenharmony_ci|CB_OK| 5393af6ab5fSopenharmony_ci~~~~~~~ 5403af6ab5fSopenharmony_ci 5413af6ab5fSopenharmony_ci.. code-block:: typescript 5423af6ab5fSopenharmony_ci 5433af6ab5fSopenharmony_ci class X { 5443af6ab5fSopenharmony_ci public f: string[] 5453af6ab5fSopenharmony_ci } 5463af6ab5fSopenharmony_ci 5473af6ab5fSopenharmony_ci let myArray: X = new X() 5483af6ab5fSopenharmony_ci const secondItem = myArray.f[1] 5493af6ab5fSopenharmony_ci 5503af6ab5fSopenharmony_ci.. _R019: 5513af6ab5fSopenharmony_ci 5523af6ab5fSopenharmony_ci|CB_R| #19: Use inheritance instead of intersection types 5533af6ab5fSopenharmony_ci--------------------------------------------------------- 5543af6ab5fSopenharmony_ci 5553af6ab5fSopenharmony_ci|CB_RULE| 5563af6ab5fSopenharmony_ci~~~~~~~~~ 5573af6ab5fSopenharmony_ci 5583af6ab5fSopenharmony_ciCurrently, |LANG| does not support intersection types. You can use inheritance 5593af6ab5fSopenharmony_cias a work-around. 5603af6ab5fSopenharmony_ci 5613af6ab5fSopenharmony_ci|CB_BAD| 5623af6ab5fSopenharmony_ci~~~~~~~~ 5633af6ab5fSopenharmony_ci 5643af6ab5fSopenharmony_ci.. code-block:: typescript 5653af6ab5fSopenharmony_ci 5663af6ab5fSopenharmony_ci interface Identity { 5673af6ab5fSopenharmony_ci id: number 5683af6ab5fSopenharmony_ci name: string 5693af6ab5fSopenharmony_ci } 5703af6ab5fSopenharmony_ci 5713af6ab5fSopenharmony_ci interface Contact { 5723af6ab5fSopenharmony_ci email: string 5733af6ab5fSopenharmony_ci phone: string 5743af6ab5fSopenharmony_ci } 5753af6ab5fSopenharmony_ci 5763af6ab5fSopenharmony_ci type Employee = Identity & Contact 5773af6ab5fSopenharmony_ci 5783af6ab5fSopenharmony_ci|CB_OK| 5793af6ab5fSopenharmony_ci~~~~~~~ 5803af6ab5fSopenharmony_ci 5813af6ab5fSopenharmony_ci.. code-block:: typescript 5823af6ab5fSopenharmony_ci 5833af6ab5fSopenharmony_ci interface Identity { 5843af6ab5fSopenharmony_ci id: number 5853af6ab5fSopenharmony_ci name: string 5863af6ab5fSopenharmony_ci } 5873af6ab5fSopenharmony_ci 5883af6ab5fSopenharmony_ci interface Contact { 5893af6ab5fSopenharmony_ci email: string 5903af6ab5fSopenharmony_ci phone: string 5913af6ab5fSopenharmony_ci } 5923af6ab5fSopenharmony_ci 5933af6ab5fSopenharmony_ci interface Employee extends Identity, Contact {} 5943af6ab5fSopenharmony_ci 5953af6ab5fSopenharmony_ci.. _R021: 5963af6ab5fSopenharmony_ci 5973af6ab5fSopenharmony_ci|CB_R| #21: Returning ``this`` type is not supported 5983af6ab5fSopenharmony_ci---------------------------------------------------- 5993af6ab5fSopenharmony_ci 6003af6ab5fSopenharmony_ci|CB_RULE| 6013af6ab5fSopenharmony_ci~~~~~~~~~ 6023af6ab5fSopenharmony_ci 6033af6ab5fSopenharmony_ci|LANG| does not support the returning ``this`` type. Use explicit type instead. 6043af6ab5fSopenharmony_ci 6053af6ab5fSopenharmony_ci|CB_BAD| 6063af6ab5fSopenharmony_ci~~~~~~~~ 6073af6ab5fSopenharmony_ci 6083af6ab5fSopenharmony_ci.. code-block:: typescript 6093af6ab5fSopenharmony_ci 6103af6ab5fSopenharmony_ci interface ListItem { 6113af6ab5fSopenharmony_ci getHead(): this 6123af6ab5fSopenharmony_ci } 6133af6ab5fSopenharmony_ci 6143af6ab5fSopenharmony_ci|CB_OK| 6153af6ab5fSopenharmony_ci~~~~~~~ 6163af6ab5fSopenharmony_ci 6173af6ab5fSopenharmony_ci.. code-block:: typescript 6183af6ab5fSopenharmony_ci 6193af6ab5fSopenharmony_ci interface ListItem { 6203af6ab5fSopenharmony_ci getHead(): ListItem 6213af6ab5fSopenharmony_ci } 6223af6ab5fSopenharmony_ci 6233af6ab5fSopenharmony_ci.. _R023: 6243af6ab5fSopenharmony_ci 6253af6ab5fSopenharmony_ci|CB_R| #22: Conditional types are not supported 6263af6ab5fSopenharmony_ci---------------------------------------------------- 6273af6ab5fSopenharmony_ci 6283af6ab5fSopenharmony_ci|CB_RULE| 6293af6ab5fSopenharmony_ci~~~~~~~~~ 6303af6ab5fSopenharmony_ci 6313af6ab5fSopenharmony_ci|LANG| does not support conditional type aliases. Introduce a new type with constraints explicitly or rewrite logic with use of ``Object``. 6323af6ab5fSopenharmony_ci``infer`` keyword is not supported. 6333af6ab5fSopenharmony_ci 6343af6ab5fSopenharmony_ci|CB_BAD| 6353af6ab5fSopenharmony_ci~~~~~~~~ 6363af6ab5fSopenharmony_ci 6373af6ab5fSopenharmony_ci.. code-block:: typescript 6383af6ab5fSopenharmony_ci 6393af6ab5fSopenharmony_ci type X<T> = T extends number ? T : never 6403af6ab5fSopenharmony_ci 6413af6ab5fSopenharmony_ci type Y<T> = T extends Array<infer Item> ? Item : never 6423af6ab5fSopenharmony_ci 6433af6ab5fSopenharmony_ci|CB_OK| 6443af6ab5fSopenharmony_ci~~~~~~~ 6453af6ab5fSopenharmony_ci 6463af6ab5fSopenharmony_ci.. code-block:: typescript 6473af6ab5fSopenharmony_ci 6483af6ab5fSopenharmony_ci // Provide explicit contraints within type alias 6493af6ab5fSopenharmony_ci type X1<T extends number> = T 6503af6ab5fSopenharmony_ci 6513af6ab5fSopenharmony_ci // Rewrite with Object. Less type control, need more type checks for safety 6523af6ab5fSopenharmony_ci type X2<T> = Object 6533af6ab5fSopenharmony_ci 6543af6ab5fSopenharmony_ci // Item has to be used as a generic parameter and need to be properly instantiated 6553af6ab5fSopenharmony_ci type YI<Item, T extends Array<Item>> = Item 6563af6ab5fSopenharmony_ci 6573af6ab5fSopenharmony_ci 6583af6ab5fSopenharmony_ci|CB_R| #23: Type queries are not supported 6593af6ab5fSopenharmony_ci------------------------------------------ 6603af6ab5fSopenharmony_ci 6613af6ab5fSopenharmony_ci|CB_RULE| 6623af6ab5fSopenharmony_ci~~~~~~~~~ 6633af6ab5fSopenharmony_ci 6643af6ab5fSopenharmony_ciCurrently, |LANG| does not support specifying types via ``typeof``. 6653af6ab5fSopenharmony_ciAll types must be specified explicitly. 6663af6ab5fSopenharmony_ci 6673af6ab5fSopenharmony_ci|CB_BAD| 6683af6ab5fSopenharmony_ci~~~~~~~~ 6693af6ab5fSopenharmony_ci 6703af6ab5fSopenharmony_ci.. code-block:: typescript 6713af6ab5fSopenharmony_ci 6723af6ab5fSopenharmony_ci var a = {x: 10, y: 20} 6733af6ab5fSopenharmony_ci var b: typeof a 6743af6ab5fSopenharmony_ci 6753af6ab5fSopenharmony_ci|CB_OK| 6763af6ab5fSopenharmony_ci~~~~~~~ 6773af6ab5fSopenharmony_ci 6783af6ab5fSopenharmony_ci.. code-block:: typescript 6793af6ab5fSopenharmony_ci 6803af6ab5fSopenharmony_ci class A { 6813af6ab5fSopenharmony_ci public x: number = 10 6823af6ab5fSopenharmony_ci public y: number = 20 6833af6ab5fSopenharmony_ci } 6843af6ab5fSopenharmony_ci 6853af6ab5fSopenharmony_ci let a: A 6863af6ab5fSopenharmony_ci let b: A 6873af6ab5fSopenharmony_ci 6883af6ab5fSopenharmony_ci.. _R025: 6893af6ab5fSopenharmony_ci 6903af6ab5fSopenharmony_ci|CB_R| #25: Declaring fields in ``constructor`` is not supported 6913af6ab5fSopenharmony_ci---------------------------------------------------------------- 6923af6ab5fSopenharmony_ci 6933af6ab5fSopenharmony_ci|CB_RULE| 6943af6ab5fSopenharmony_ci~~~~~~~~~ 6953af6ab5fSopenharmony_ci 6963af6ab5fSopenharmony_ci|LANG| does not support declaring class fields in the ``constructor``. 6973af6ab5fSopenharmony_ciYou must declare them inside the ``class`` declaration instead. 6983af6ab5fSopenharmony_ci 6993af6ab5fSopenharmony_ci|CB_BAD| 7003af6ab5fSopenharmony_ci~~~~~~~~ 7013af6ab5fSopenharmony_ci 7023af6ab5fSopenharmony_ci.. code-block:: typescript 7033af6ab5fSopenharmony_ci 7043af6ab5fSopenharmony_ci class Person { 7053af6ab5fSopenharmony_ci constructor( 7063af6ab5fSopenharmony_ci protected ssn: string, 7073af6ab5fSopenharmony_ci private firstName: string, 7083af6ab5fSopenharmony_ci private lastName: string 7093af6ab5fSopenharmony_ci ) { 7103af6ab5fSopenharmony_ci this.ssn = ssn 7113af6ab5fSopenharmony_ci this.firstName = firstName 7123af6ab5fSopenharmony_ci this.lastName = lastName 7133af6ab5fSopenharmony_ci } 7143af6ab5fSopenharmony_ci 7153af6ab5fSopenharmony_ci getFullName(): string { 7163af6ab5fSopenharmony_ci return this.firstName + " " + this.lastName 7173af6ab5fSopenharmony_ci } 7183af6ab5fSopenharmony_ci } 7193af6ab5fSopenharmony_ci 7203af6ab5fSopenharmony_ci|CB_OK| 7213af6ab5fSopenharmony_ci~~~~~~~ 7223af6ab5fSopenharmony_ci 7233af6ab5fSopenharmony_ci.. code-block:: typescript 7243af6ab5fSopenharmony_ci 7253af6ab5fSopenharmony_ci class Person { 7263af6ab5fSopenharmony_ci protected ssn: string 7273af6ab5fSopenharmony_ci private firstName: string 7283af6ab5fSopenharmony_ci private lastName: string 7293af6ab5fSopenharmony_ci 7303af6ab5fSopenharmony_ci constructor(ssn: string, firstName: string, lastName: string) { 7313af6ab5fSopenharmony_ci this.ssn = ssn 7323af6ab5fSopenharmony_ci this.firstName = firstName 7333af6ab5fSopenharmony_ci this.lastName = lastName 7343af6ab5fSopenharmony_ci } 7353af6ab5fSopenharmony_ci 7363af6ab5fSopenharmony_ci getFullName(): string { 7373af6ab5fSopenharmony_ci return this.firstName + " " + this.lastName 7383af6ab5fSopenharmony_ci } 7393af6ab5fSopenharmony_ci } 7403af6ab5fSopenharmony_ci 7413af6ab5fSopenharmony_ci.. _R027: 7423af6ab5fSopenharmony_ci 7433af6ab5fSopenharmony_ci|CB_R| #27: Construct signatures not supported in interfaces 7443af6ab5fSopenharmony_ci------------------------------------------------------------ 7453af6ab5fSopenharmony_ci 7463af6ab5fSopenharmony_ci|CB_RULE| 7473af6ab5fSopenharmony_ci~~~~~~~~~ 7483af6ab5fSopenharmony_ci 7493af6ab5fSopenharmony_ci|LANG| does not support construct signatures. Use methods instead. 7503af6ab5fSopenharmony_ci 7513af6ab5fSopenharmony_ci|CB_BAD| 7523af6ab5fSopenharmony_ci~~~~~~~~ 7533af6ab5fSopenharmony_ci 7543af6ab5fSopenharmony_ci.. code-block:: typescript 7553af6ab5fSopenharmony_ci 7563af6ab5fSopenharmony_ci interface I { 7573af6ab5fSopenharmony_ci new (s: string): I 7583af6ab5fSopenharmony_ci } 7593af6ab5fSopenharmony_ci 7603af6ab5fSopenharmony_ci function fn(i: I) { 7613af6ab5fSopenharmony_ci return new i("hello"); 7623af6ab5fSopenharmony_ci } 7633af6ab5fSopenharmony_ci 7643af6ab5fSopenharmony_ci|CB_OK| 7653af6ab5fSopenharmony_ci~~~~~~~ 7663af6ab5fSopenharmony_ci 7673af6ab5fSopenharmony_ci.. code-block:: typescript 7683af6ab5fSopenharmony_ci 7693af6ab5fSopenharmony_ci interface I { 7703af6ab5fSopenharmony_ci create(s: string): I 7713af6ab5fSopenharmony_ci } 7723af6ab5fSopenharmony_ci 7733af6ab5fSopenharmony_ci function fn(i: I) { 7743af6ab5fSopenharmony_ci return i.create("hello") 7753af6ab5fSopenharmony_ci } 7763af6ab5fSopenharmony_ci 7773af6ab5fSopenharmony_ci|CB_SEE| 7783af6ab5fSopenharmony_ci~~~~~~~~ 7793af6ab5fSopenharmony_ci 7803af6ab5fSopenharmony_ci* :ref:`R015` 7813af6ab5fSopenharmony_ci 7823af6ab5fSopenharmony_ci.. _R028: 7833af6ab5fSopenharmony_ci 7843af6ab5fSopenharmony_ci|CB_R| #28: Indexed access types are not supported 7853af6ab5fSopenharmony_ci-------------------------------------------------- 7863af6ab5fSopenharmony_ci 7873af6ab5fSopenharmony_ci|CB_RULE| 7883af6ab5fSopenharmony_ci~~~~~~~~~ 7893af6ab5fSopenharmony_ci 7903af6ab5fSopenharmony_ci|LANG| does not support indexed access types. Use the type name instead. 7913af6ab5fSopenharmony_ci 7923af6ab5fSopenharmony_ci|CB_BAD| 7933af6ab5fSopenharmony_ci~~~~~~~~ 7943af6ab5fSopenharmony_ci 7953af6ab5fSopenharmony_ci.. code-block:: typescript 7963af6ab5fSopenharmony_ci 7973af6ab5fSopenharmony_ci type Point = {x: number, y: number} 7983af6ab5fSopenharmony_ci type N = Point["x"] // is equal to number 7993af6ab5fSopenharmony_ci 8003af6ab5fSopenharmony_ci|CB_OK| 8013af6ab5fSopenharmony_ci~~~~~~~ 8023af6ab5fSopenharmony_ci 8033af6ab5fSopenharmony_ci.. code-block:: typescript 8043af6ab5fSopenharmony_ci 8053af6ab5fSopenharmony_ci class Point {x: number = 0; y: number = 0} 8063af6ab5fSopenharmony_ci type N = number 8073af6ab5fSopenharmony_ci 8083af6ab5fSopenharmony_ci.. _R029: 8093af6ab5fSopenharmony_ci 8103af6ab5fSopenharmony_ci|CB_R| #29: Indexed access is not supported for fields 8113af6ab5fSopenharmony_ci------------------------------------------------------ 8123af6ab5fSopenharmony_ci 8133af6ab5fSopenharmony_ci|CB_RULE| 8143af6ab5fSopenharmony_ci~~~~~~~~~ 8153af6ab5fSopenharmony_ci 8163af6ab5fSopenharmony_ci|LANG| does not support indexed access for class fields. Use dot notation instead. 8173af6ab5fSopenharmony_ci 8183af6ab5fSopenharmony_ci|CB_BAD| 8193af6ab5fSopenharmony_ci~~~~~~~~ 8203af6ab5fSopenharmony_ci 8213af6ab5fSopenharmony_ci.. code-block:: typescript 8223af6ab5fSopenharmony_ci 8233af6ab5fSopenharmony_ci class Point {x: number = 0; y: number = 0} 8243af6ab5fSopenharmony_ci let p: Point = {x: 1, y: 2} 8253af6ab5fSopenharmony_ci let x = p["x"] 8263af6ab5fSopenharmony_ci 8273af6ab5fSopenharmony_ci|CB_OK| 8283af6ab5fSopenharmony_ci~~~~~~~ 8293af6ab5fSopenharmony_ci 8303af6ab5fSopenharmony_ci.. code-block:: typescript 8313af6ab5fSopenharmony_ci 8323af6ab5fSopenharmony_ci class Point {x: number = 0; y: number = 0} 8333af6ab5fSopenharmony_ci let p: Point = {x: 1, y: 2} 8343af6ab5fSopenharmony_ci let x = p.x 8353af6ab5fSopenharmony_ci 8363af6ab5fSopenharmony_ci.. _R030: 8373af6ab5fSopenharmony_ci 8383af6ab5fSopenharmony_ci|CB_R| #30: Structural identity is not supported 8393af6ab5fSopenharmony_ci------------------------------------------------ 8403af6ab5fSopenharmony_ci 8413af6ab5fSopenharmony_ci|CB_RULE| 8423af6ab5fSopenharmony_ci~~~~~~~~~ 8433af6ab5fSopenharmony_ci 8443af6ab5fSopenharmony_ciCurrently, |LANG| does not support structural identity, i.e., the compiler 8453af6ab5fSopenharmony_cicannot compare two types' public APIs and decide whether such types are 8463af6ab5fSopenharmony_ciidentical. Use other mechanisms (inheritance, interfaces or type aliases) 8473af6ab5fSopenharmony_ciinstead. 8483af6ab5fSopenharmony_ci 8493af6ab5fSopenharmony_ciIn |TS|, types ``X`` and ``Y`` are equal (interchangeble), while in |LANG| 8503af6ab5fSopenharmony_cithey are not. 8513af6ab5fSopenharmony_ci 8523af6ab5fSopenharmony_ci|CB_BAD| 8533af6ab5fSopenharmony_ci~~~~~~~~ 8543af6ab5fSopenharmony_ci 8553af6ab5fSopenharmony_ci.. code-block:: typescript 8563af6ab5fSopenharmony_ci 8573af6ab5fSopenharmony_ci interface X { 8583af6ab5fSopenharmony_ci f(): string 8593af6ab5fSopenharmony_ci } 8603af6ab5fSopenharmony_ci 8613af6ab5fSopenharmony_ci interface Y { // Y is equal to X 8623af6ab5fSopenharmony_ci f(): string 8633af6ab5fSopenharmony_ci } 8643af6ab5fSopenharmony_ci 8653af6ab5fSopenharmony_ci|CB_OK| 8663af6ab5fSopenharmony_ci~~~~~~~ 8673af6ab5fSopenharmony_ci 8683af6ab5fSopenharmony_ci|LANG| does not support structural identity. In the static environment the 8693af6ab5fSopenharmony_cicompiler checks if two classes or interfaces are equal, but there is no way 8703af6ab5fSopenharmony_cito compare unrelated (by inheritance or interface) classes that are 8713af6ab5fSopenharmony_cistructurally equivalent. 8723af6ab5fSopenharmony_ci 8733af6ab5fSopenharmony_ci.. code-block:: typescript 8743af6ab5fSopenharmony_ci 8753af6ab5fSopenharmony_ci interface X { 8763af6ab5fSopenharmony_ci f(): string 8773af6ab5fSopenharmony_ci } 8783af6ab5fSopenharmony_ci 8793af6ab5fSopenharmony_ci type Y = X // Y is equal to X 8803af6ab5fSopenharmony_ci 8813af6ab5fSopenharmony_ci|CB_SEE| 8823af6ab5fSopenharmony_ci~~~~~~~~ 8833af6ab5fSopenharmony_ci 8843af6ab5fSopenharmony_ci* :ref:`R031` 8853af6ab5fSopenharmony_ci* :ref:`R032` 8863af6ab5fSopenharmony_ci* :ref:`R035` 8873af6ab5fSopenharmony_ci 8883af6ab5fSopenharmony_ci 8893af6ab5fSopenharmony_ci.. _R031: 8903af6ab5fSopenharmony_ci 8913af6ab5fSopenharmony_ci|CB_R| #31: Structural typing is not supported for subtyping / supertyping 8923af6ab5fSopenharmony_ci-------------------------------------------------------------------------- 8933af6ab5fSopenharmony_ci 8943af6ab5fSopenharmony_ci|CB_RULE| 8953af6ab5fSopenharmony_ci~~~~~~~~~ 8963af6ab5fSopenharmony_ci 8973af6ab5fSopenharmony_ciCurrently, |LANG| does not check structural equivalence for type inference, i.e., 8983af6ab5fSopenharmony_cithe compiler cannot compare two types' public APIs and decide whether such types 8993af6ab5fSopenharmony_ciare identical. 9003af6ab5fSopenharmony_ciUse other mechanisms (inheritance or interfaces) instead. 9013af6ab5fSopenharmony_ci 9023af6ab5fSopenharmony_ci|CB_BAD| 9033af6ab5fSopenharmony_ci~~~~~~~~ 9043af6ab5fSopenharmony_ci 9053af6ab5fSopenharmony_ci.. code-block:: typescript 9063af6ab5fSopenharmony_ci 9073af6ab5fSopenharmony_ci class X { 9083af6ab5fSopenharmony_ci public foo: number 9093af6ab5fSopenharmony_ci 9103af6ab5fSopenharmony_ci constructor() { 9113af6ab5fSopenharmony_ci this.foo = 0 9123af6ab5fSopenharmony_ci } 9133af6ab5fSopenharmony_ci } 9143af6ab5fSopenharmony_ci 9153af6ab5fSopenharmony_ci class Y { 9163af6ab5fSopenharmony_ci public foo: number 9173af6ab5fSopenharmony_ci 9183af6ab5fSopenharmony_ci constructor() { 9193af6ab5fSopenharmony_ci this.foo = 0 9203af6ab5fSopenharmony_ci } 9213af6ab5fSopenharmony_ci } 9223af6ab5fSopenharmony_ci 9233af6ab5fSopenharmony_ci let x = new X() 9243af6ab5fSopenharmony_ci let y = new Y() 9253af6ab5fSopenharmony_ci 9263af6ab5fSopenharmony_ci console.log("Assign X to Y") 9273af6ab5fSopenharmony_ci y = x 9283af6ab5fSopenharmony_ci 9293af6ab5fSopenharmony_ci console.log("Assign Y to X") 9303af6ab5fSopenharmony_ci x = y 9313af6ab5fSopenharmony_ci 9323af6ab5fSopenharmony_ci 9333af6ab5fSopenharmony_ci|CB_OK| 9343af6ab5fSopenharmony_ci~~~~~~~ 9353af6ab5fSopenharmony_ci 9363af6ab5fSopenharmony_ci.. code-block:: typescript 9373af6ab5fSopenharmony_ci 9383af6ab5fSopenharmony_ci class X { 9393af6ab5fSopenharmony_ci public foo: number 9403af6ab5fSopenharmony_ci 9413af6ab5fSopenharmony_ci constructor() { 9423af6ab5fSopenharmony_ci this.foo = 0 9433af6ab5fSopenharmony_ci } 9443af6ab5fSopenharmony_ci } 9453af6ab5fSopenharmony_ci 9463af6ab5fSopenharmony_ci // Y is derived from X, which explicitly set subtype / supertype relations: 9473af6ab5fSopenharmony_ci class Y extends X { 9483af6ab5fSopenharmony_ci constructor() { 9493af6ab5fSopenharmony_ci super() 9503af6ab5fSopenharmony_ci } 9513af6ab5fSopenharmony_ci } 9523af6ab5fSopenharmony_ci 9533af6ab5fSopenharmony_ci let x = new X() 9543af6ab5fSopenharmony_ci let y = new Y() 9553af6ab5fSopenharmony_ci 9563af6ab5fSopenharmony_ci console.log("Assign X to Y") 9573af6ab5fSopenharmony_ci y = x // ok, X is the super class of X 9583af6ab5fSopenharmony_ci 9593af6ab5fSopenharmony_ci // Cannot assign Y to X 9603af6ab5fSopenharmony_ci //x = y - compile-time error 9613af6ab5fSopenharmony_ci 9623af6ab5fSopenharmony_ci 9633af6ab5fSopenharmony_ci|CB_SEE| 9643af6ab5fSopenharmony_ci~~~~~~~~ 9653af6ab5fSopenharmony_ci 9663af6ab5fSopenharmony_ci* :ref:`R030` 9673af6ab5fSopenharmony_ci* :ref:`R032` 9683af6ab5fSopenharmony_ci* :ref:`R035` 9693af6ab5fSopenharmony_ci 9703af6ab5fSopenharmony_ci.. _R032: 9713af6ab5fSopenharmony_ci 9723af6ab5fSopenharmony_ci|CB_R| #32: Structural typing is not supported for assignability checks 9733af6ab5fSopenharmony_ci----------------------------------------------------------------------- 9743af6ab5fSopenharmony_ci 9753af6ab5fSopenharmony_ci|CB_RULE| 9763af6ab5fSopenharmony_ci~~~~~~~~~ 9773af6ab5fSopenharmony_ci 9783af6ab5fSopenharmony_ciCurrently, |LANG| does not check structural equivalence when checking if types 9793af6ab5fSopenharmony_ciare assignable to each other, i.e., the compiler cannot compare two types' 9803af6ab5fSopenharmony_cipublic APIs and decide whether such types are identical. Use other mechanisms 9813af6ab5fSopenharmony_ci(inheritance or interfaces) instead. 9823af6ab5fSopenharmony_ci 9833af6ab5fSopenharmony_ci|CB_BAD| 9843af6ab5fSopenharmony_ci~~~~~~~~ 9853af6ab5fSopenharmony_ci 9863af6ab5fSopenharmony_ci.. code-block:: typescript 9873af6ab5fSopenharmony_ci 9883af6ab5fSopenharmony_ci class X { 9893af6ab5fSopenharmony_ci public foo: number 9903af6ab5fSopenharmony_ci 9913af6ab5fSopenharmony_ci constructor() { 9923af6ab5fSopenharmony_ci this.foo = 0 9933af6ab5fSopenharmony_ci } 9943af6ab5fSopenharmony_ci } 9953af6ab5fSopenharmony_ci 9963af6ab5fSopenharmony_ci class Y { 9973af6ab5fSopenharmony_ci public foo: number 9983af6ab5fSopenharmony_ci constructor() { 9993af6ab5fSopenharmony_ci this.foo = 0 10003af6ab5fSopenharmony_ci } 10013af6ab5fSopenharmony_ci } 10023af6ab5fSopenharmony_ci 10033af6ab5fSopenharmony_ci let x = new X() 10043af6ab5fSopenharmony_ci let y = new Y() 10053af6ab5fSopenharmony_ci 10063af6ab5fSopenharmony_ci console.log("Assign X to Y") 10073af6ab5fSopenharmony_ci y = x 10083af6ab5fSopenharmony_ci 10093af6ab5fSopenharmony_ci console.log("Assign Y to X") 10103af6ab5fSopenharmony_ci x = y 10113af6ab5fSopenharmony_ci 10123af6ab5fSopenharmony_ci|CB_OK| 10133af6ab5fSopenharmony_ci~~~~~~~ 10143af6ab5fSopenharmony_ci 10153af6ab5fSopenharmony_ci.. code-block:: typescript 10163af6ab5fSopenharmony_ci 10173af6ab5fSopenharmony_ci interface Z { 10183af6ab5fSopenharmony_ci foo: number 10193af6ab5fSopenharmony_ci } 10203af6ab5fSopenharmony_ci 10213af6ab5fSopenharmony_ci // X implements interface Z, which makes relation between X and Y explicit. 10223af6ab5fSopenharmony_ci class X implements Z { 10233af6ab5fSopenharmony_ci public foo: number 10243af6ab5fSopenharmony_ci 10253af6ab5fSopenharmony_ci constructor() { 10263af6ab5fSopenharmony_ci this.foo = 0 10273af6ab5fSopenharmony_ci } 10283af6ab5fSopenharmony_ci } 10293af6ab5fSopenharmony_ci 10303af6ab5fSopenharmony_ci // Y implements interface Z, which makes relation between X and Y explicit. 10313af6ab5fSopenharmony_ci class Y implements Z { 10323af6ab5fSopenharmony_ci public foo: number 10333af6ab5fSopenharmony_ci 10343af6ab5fSopenharmony_ci constructor() { 10353af6ab5fSopenharmony_ci this.foo = 0 10363af6ab5fSopenharmony_ci } 10373af6ab5fSopenharmony_ci } 10383af6ab5fSopenharmony_ci 10393af6ab5fSopenharmony_ci let x: Z = new X() 10403af6ab5fSopenharmony_ci let y: Z = new Y() 10413af6ab5fSopenharmony_ci 10423af6ab5fSopenharmony_ci console.log("Assign X to Y") 10433af6ab5fSopenharmony_ci y = x // ok, both are of the same type 10443af6ab5fSopenharmony_ci 10453af6ab5fSopenharmony_ci console.log("Assign Y to X") 10463af6ab5fSopenharmony_ci x = y // ok, both are of the same type 10473af6ab5fSopenharmony_ci 10483af6ab5fSopenharmony_ci|CB_SEE| 10493af6ab5fSopenharmony_ci~~~~~~~~ 10503af6ab5fSopenharmony_ci 10513af6ab5fSopenharmony_ci* :ref:`R030` 10523af6ab5fSopenharmony_ci* :ref:`R031` 10533af6ab5fSopenharmony_ci* :ref:`R035` 10543af6ab5fSopenharmony_ci 10553af6ab5fSopenharmony_ci.. _R034: 10563af6ab5fSopenharmony_ci 10573af6ab5fSopenharmony_ci|CB_R| #34: Generic functions must be called with explicit type specialization 10583af6ab5fSopenharmony_ci------------------------------------------------------------------------------ 10593af6ab5fSopenharmony_ci 10603af6ab5fSopenharmony_ci|CB_RULE| 10613af6ab5fSopenharmony_ci~~~~~~~~~ 10623af6ab5fSopenharmony_ci 10633af6ab5fSopenharmony_ciCurrently, |LANG| does not support inference of type parameters in case of calls 10643af6ab5fSopenharmony_cito generic functions. If a function is declared generic, all calls must specify 10653af6ab5fSopenharmony_citype parameters explicitly. 10663af6ab5fSopenharmony_ci 10673af6ab5fSopenharmony_ci|CB_BAD| 10683af6ab5fSopenharmony_ci~~~~~~~~ 10693af6ab5fSopenharmony_ci 10703af6ab5fSopenharmony_ci.. code-block:: typescript 10713af6ab5fSopenharmony_ci 10723af6ab5fSopenharmony_ci function choose<T>(x: T, y: T): T { 10733af6ab5fSopenharmony_ci return Math.random() < 0.5 ? x : y 10743af6ab5fSopenharmony_ci } 10753af6ab5fSopenharmony_ci 10763af6ab5fSopenharmony_ci let x = choose(10, 20) // Ok 10773af6ab5fSopenharmony_ci let y = choose("10", 20) // Compile-time error 10783af6ab5fSopenharmony_ci 10793af6ab5fSopenharmony_ci|CB_OK| 10803af6ab5fSopenharmony_ci~~~~~~~ 10813af6ab5fSopenharmony_ci 10823af6ab5fSopenharmony_ci.. code-block:: typescript 10833af6ab5fSopenharmony_ci 10843af6ab5fSopenharmony_ci function choose<T>(x: T, y: T): T { 10853af6ab5fSopenharmony_ci return Math.random() < 0.5 ? x : y 10863af6ab5fSopenharmony_ci } 10873af6ab5fSopenharmony_ci 10883af6ab5fSopenharmony_ci let x = choose<number>(10, 20) // Ok 10893af6ab5fSopenharmony_ci let y = choose<number>("10", 20) // Compile-time error 10903af6ab5fSopenharmony_ci 10913af6ab5fSopenharmony_ci.. _R035: 10923af6ab5fSopenharmony_ci 10933af6ab5fSopenharmony_ci|CB_R| #35: Structural typing is not supported for type inference 10943af6ab5fSopenharmony_ci----------------------------------------------------------------- 10953af6ab5fSopenharmony_ci 10963af6ab5fSopenharmony_ci|CB_RULE| 10973af6ab5fSopenharmony_ci~~~~~~~~~ 10983af6ab5fSopenharmony_ci 10993af6ab5fSopenharmony_ciCurrently, |LANG| does not support structural typing, i.e., the compiler cannot 11003af6ab5fSopenharmony_cicompare two types' public APIs and decide whether such types are identical. 11013af6ab5fSopenharmony_ciUse inheritance and interfaces to specify the relation between the types 11023af6ab5fSopenharmony_ciexplicitly. 11033af6ab5fSopenharmony_ci 11043af6ab5fSopenharmony_ci|CB_BAD| 11053af6ab5fSopenharmony_ci~~~~~~~~ 11063af6ab5fSopenharmony_ci 11073af6ab5fSopenharmony_ci.. code-block:: typescript 11083af6ab5fSopenharmony_ci 11093af6ab5fSopenharmony_ci class X { 11103af6ab5fSopenharmony_ci public foo: number 11113af6ab5fSopenharmony_ci private s: string 11123af6ab5fSopenharmony_ci 11133af6ab5fSopenharmony_ci constructor (f: number) { 11143af6ab5fSopenharmony_ci this.foo = f 11153af6ab5fSopenharmony_ci this.s = "" 11163af6ab5fSopenharmony_ci } 11173af6ab5fSopenharmony_ci 11183af6ab5fSopenharmony_ci public say(): void { 11193af6ab5fSopenharmony_ci console.log("X = ", this.foo) 11203af6ab5fSopenharmony_ci } 11213af6ab5fSopenharmony_ci } 11223af6ab5fSopenharmony_ci 11233af6ab5fSopenharmony_ci class Y { 11243af6ab5fSopenharmony_ci public foo: number 11253af6ab5fSopenharmony_ci 11263af6ab5fSopenharmony_ci constructor (f: number) { 11273af6ab5fSopenharmony_ci this.foo = f 11283af6ab5fSopenharmony_ci } 11293af6ab5fSopenharmony_ci public say(): void { 11303af6ab5fSopenharmony_ci console.log("Y = ", this.foo) 11313af6ab5fSopenharmony_ci } 11323af6ab5fSopenharmony_ci } 11333af6ab5fSopenharmony_ci 11343af6ab5fSopenharmony_ci function bar(z: X): void { 11353af6ab5fSopenharmony_ci z.say() 11363af6ab5fSopenharmony_ci } 11373af6ab5fSopenharmony_ci 11383af6ab5fSopenharmony_ci // X and Y are equivalent because their public API is equivalent. 11393af6ab5fSopenharmony_ci // Thus the second call is allowed: 11403af6ab5fSopenharmony_ci bar(new X(1)); 11413af6ab5fSopenharmony_ci bar(new Y(2)); 11423af6ab5fSopenharmony_ci 11433af6ab5fSopenharmony_ci|CB_OK| 11443af6ab5fSopenharmony_ci~~~~~~~ 11453af6ab5fSopenharmony_ci 11463af6ab5fSopenharmony_ci.. code-block:: typescript 11473af6ab5fSopenharmony_ci 11483af6ab5fSopenharmony_ci interface Z { 11493af6ab5fSopenharmony_ci say(): void 11503af6ab5fSopenharmony_ci } 11513af6ab5fSopenharmony_ci 11523af6ab5fSopenharmony_ci class X implements Z { 11533af6ab5fSopenharmony_ci public foo: number 11543af6ab5fSopenharmony_ci private s: string 11553af6ab5fSopenharmony_ci 11563af6ab5fSopenharmony_ci constructor (f: number) { 11573af6ab5fSopenharmony_ci this.foo = f 11583af6ab5fSopenharmony_ci this.s = "" 11593af6ab5fSopenharmony_ci } 11603af6ab5fSopenharmony_ci public say(): void { 11613af6ab5fSopenharmony_ci console.log("X = ", this.foo) 11623af6ab5fSopenharmony_ci } 11633af6ab5fSopenharmony_ci } 11643af6ab5fSopenharmony_ci 11653af6ab5fSopenharmony_ci class Y implements Z { 11663af6ab5fSopenharmony_ci public foo: number 11673af6ab5fSopenharmony_ci 11683af6ab5fSopenharmony_ci constructor (f: number) { 11693af6ab5fSopenharmony_ci this.foo = f 11703af6ab5fSopenharmony_ci } 11713af6ab5fSopenharmony_ci public say(): void { 11723af6ab5fSopenharmony_ci console.log("Y = ", this.foo) 11733af6ab5fSopenharmony_ci } 11743af6ab5fSopenharmony_ci } 11753af6ab5fSopenharmony_ci 11763af6ab5fSopenharmony_ci function bar(z: Z): void { 11773af6ab5fSopenharmony_ci z.say() 11783af6ab5fSopenharmony_ci } 11793af6ab5fSopenharmony_ci 11803af6ab5fSopenharmony_ci // X and Y implement the same interface Z, thus both calls are allowed: 11813af6ab5fSopenharmony_ci bar(new X(1)) 11823af6ab5fSopenharmony_ci bar(new Y(2)) 11833af6ab5fSopenharmony_ci 11843af6ab5fSopenharmony_ci|CB_SEE| 11853af6ab5fSopenharmony_ci~~~~~~~~ 11863af6ab5fSopenharmony_ci 11873af6ab5fSopenharmony_ci* :ref:`R030` 11883af6ab5fSopenharmony_ci* :ref:`R031` 11893af6ab5fSopenharmony_ci* :ref:`R032` 11903af6ab5fSopenharmony_ci 11913af6ab5fSopenharmony_ci.. _R037: 11923af6ab5fSopenharmony_ci 11933af6ab5fSopenharmony_ci|CB_R| #37: RegExp literals are not supported 11943af6ab5fSopenharmony_ci--------------------------------------------- 11953af6ab5fSopenharmony_ci 11963af6ab5fSopenharmony_ci|CB_RULE| 11973af6ab5fSopenharmony_ci~~~~~~~~~ 11983af6ab5fSopenharmony_ci 11993af6ab5fSopenharmony_ciCurrently, |LANG| does not support RegExp literals. Use library call with string 12003af6ab5fSopenharmony_ciliterals instead. 12013af6ab5fSopenharmony_ci 12023af6ab5fSopenharmony_ci|CB_BAD| 12033af6ab5fSopenharmony_ci~~~~~~~~ 12043af6ab5fSopenharmony_ci 12053af6ab5fSopenharmony_ci.. code-block:: typescript 12063af6ab5fSopenharmony_ci 12073af6ab5fSopenharmony_ci let regex: RegExp = /bc*d/ 12083af6ab5fSopenharmony_ci 12093af6ab5fSopenharmony_ci|CB_OK| 12103af6ab5fSopenharmony_ci~~~~~~~ 12113af6ab5fSopenharmony_ci 12123af6ab5fSopenharmony_ci.. code-block:: typescript 12133af6ab5fSopenharmony_ci 12143af6ab5fSopenharmony_ci let regex: RegExp = new RegExp("/bc*d/") 12153af6ab5fSopenharmony_ci 12163af6ab5fSopenharmony_ci.. _R038: 12173af6ab5fSopenharmony_ci 12183af6ab5fSopenharmony_ci|CB_R| #38: Object literal must correspond to explicitly declared class or interface 12193af6ab5fSopenharmony_ci------------------------------------------------------------------------------------ 12203af6ab5fSopenharmony_ci 12213af6ab5fSopenharmony_ci|CB_RULE| 12223af6ab5fSopenharmony_ci~~~~~~~~~ 12233af6ab5fSopenharmony_ci 12243af6ab5fSopenharmony_ci|LANG| supports the usage of object literals if the compiler can infer 12253af6ab5fSopenharmony_cito what classes or interfaces such literals correspond to. 12263af6ab5fSopenharmony_ciOtherwise, a compile-time error occurs. 12273af6ab5fSopenharmony_ci 12283af6ab5fSopenharmony_ciThe class or interface can be specified as a type annotation for a variable. 12293af6ab5fSopenharmony_ci 12303af6ab5fSopenharmony_ci|CB_BAD| 12313af6ab5fSopenharmony_ci~~~~~~~~ 12323af6ab5fSopenharmony_ci 12333af6ab5fSopenharmony_ci.. code-block:: typescript 12343af6ab5fSopenharmony_ci 12353af6ab5fSopenharmony_ci let x = {f: 1} 12363af6ab5fSopenharmony_ci 12373af6ab5fSopenharmony_ci|CB_OK| 12383af6ab5fSopenharmony_ci~~~~~~~ 12393af6ab5fSopenharmony_ci 12403af6ab5fSopenharmony_ci.. code-block:: typescript 12413af6ab5fSopenharmony_ci 12423af6ab5fSopenharmony_ci class O { 12433af6ab5fSopenharmony_ci f: number 12443af6ab5fSopenharmony_ci } 12453af6ab5fSopenharmony_ci 12463af6ab5fSopenharmony_ci let x: O = {f: 1} // OK 12473af6ab5fSopenharmony_ci let y = {f: 1} // Compile-time error, cannot infer object literal type 12483af6ab5fSopenharmony_ci let z: Object = {f: 2} // Compile-time error, class 'Object' does not have field 'f' 12493af6ab5fSopenharmony_ci 12503af6ab5fSopenharmony_ci|CB_SEE| 12513af6ab5fSopenharmony_ci~~~~~~~~ 12523af6ab5fSopenharmony_ci 12533af6ab5fSopenharmony_ci* :ref:`R040` 12543af6ab5fSopenharmony_ci* :ref:`R043` 12553af6ab5fSopenharmony_ci 12563af6ab5fSopenharmony_ci.. _R040: 12573af6ab5fSopenharmony_ci 12583af6ab5fSopenharmony_ci|CB_R| #40: Object literals cannot be used as type declarations 12593af6ab5fSopenharmony_ci--------------------------------------------------------------- 12603af6ab5fSopenharmony_ci 12613af6ab5fSopenharmony_ci|CB_RULE| 12623af6ab5fSopenharmony_ci~~~~~~~~~ 12633af6ab5fSopenharmony_ci 12643af6ab5fSopenharmony_ci|LANG| does not support the usage of object literals to declare 12653af6ab5fSopenharmony_citypes in place. Declare classes and interfaces explicitly instead. 12663af6ab5fSopenharmony_ci 12673af6ab5fSopenharmony_ci|CB_BAD| 12683af6ab5fSopenharmony_ci~~~~~~~~ 12693af6ab5fSopenharmony_ci 12703af6ab5fSopenharmony_ci.. code-block:: typescript 12713af6ab5fSopenharmony_ci 12723af6ab5fSopenharmony_ci let o: {x: number, y: number} = { 12733af6ab5fSopenharmony_ci x: 2, 12743af6ab5fSopenharmony_ci y: 3 12753af6ab5fSopenharmony_ci } 12763af6ab5fSopenharmony_ci 12773af6ab5fSopenharmony_ci type T = G<{x: number, y: number}> 12783af6ab5fSopenharmony_ci 12793af6ab5fSopenharmony_ci|CB_OK| 12803af6ab5fSopenharmony_ci~~~~~~~ 12813af6ab5fSopenharmony_ci 12823af6ab5fSopenharmony_ci.. code-block:: typescript 12833af6ab5fSopenharmony_ci 12843af6ab5fSopenharmony_ci class O { 12853af6ab5fSopenharmony_ci x: number 12863af6ab5fSopenharmony_ci y: number 12873af6ab5fSopenharmony_ci } 12883af6ab5fSopenharmony_ci 12893af6ab5fSopenharmony_ci let o: O = {x: 2, y: 3} 12903af6ab5fSopenharmony_ci 12913af6ab5fSopenharmony_ci type T = G<O> 12923af6ab5fSopenharmony_ci 12933af6ab5fSopenharmony_ci|CB_SEE| 12943af6ab5fSopenharmony_ci~~~~~~~~ 12953af6ab5fSopenharmony_ci 12963af6ab5fSopenharmony_ci* :ref:`R038` 12973af6ab5fSopenharmony_ci* :ref:`R043` 12983af6ab5fSopenharmony_ci 12993af6ab5fSopenharmony_ci.. _R043: 13003af6ab5fSopenharmony_ci 13013af6ab5fSopenharmony_ci|CB_R| #43: Untyped array literals are not supported 13023af6ab5fSopenharmony_ci---------------------------------------------------- 13033af6ab5fSopenharmony_ci 13043af6ab5fSopenharmony_ci|CB_RULE| 13053af6ab5fSopenharmony_ci~~~~~~~~~ 13063af6ab5fSopenharmony_ci 13073af6ab5fSopenharmony_ci|LANG| does not support the usage of untyped array literals. The type of an 13083af6ab5fSopenharmony_ciarray element must be inferred from the context. Use the type ``Object`` to 13093af6ab5fSopenharmony_cidefine mixed types array. 13103af6ab5fSopenharmony_ci 13113af6ab5fSopenharmony_ci|CB_BAD| 13123af6ab5fSopenharmony_ci~~~~~~~~ 13133af6ab5fSopenharmony_ci 13143af6ab5fSopenharmony_ci.. code-block:: typescript 13153af6ab5fSopenharmony_ci 13163af6ab5fSopenharmony_ci let x = [1, 2] 13173af6ab5fSopenharmony_ci let y = [1, "aa"] 13183af6ab5fSopenharmony_ci 13193af6ab5fSopenharmony_ci|CB_OK| 13203af6ab5fSopenharmony_ci~~~~~~~ 13213af6ab5fSopenharmony_ci 13223af6ab5fSopenharmony_ci.. code-block:: typescript 13233af6ab5fSopenharmony_ci 13243af6ab5fSopenharmony_ci let x: Object[] = [new Int(1), new Int(2)] 13253af6ab5fSopenharmony_ci 13263af6ab5fSopenharmony_ci // Implicit boxing of primitive int to object Int 13273af6ab5fSopenharmony_ci let x1: Object[] = [1, 2] 13283af6ab5fSopenharmony_ci 13293af6ab5fSopenharmony_ci let y: Object[] = [1, "aa"] 13303af6ab5fSopenharmony_ci 13313af6ab5fSopenharmony_ci|CB_SEE| 13323af6ab5fSopenharmony_ci~~~~~~~~ 13333af6ab5fSopenharmony_ci 13343af6ab5fSopenharmony_ci* :ref:`R038` 13353af6ab5fSopenharmony_ci* :ref:`R040` 13363af6ab5fSopenharmony_ci 13373af6ab5fSopenharmony_ci.. _R044: 13383af6ab5fSopenharmony_ci 13393af6ab5fSopenharmony_ci|CB_R| #44: Template literals are not supported 13403af6ab5fSopenharmony_ci----------------------------------------------- 13413af6ab5fSopenharmony_ci 13423af6ab5fSopenharmony_ci|CB_RULE| 13433af6ab5fSopenharmony_ci~~~~~~~~~ 13443af6ab5fSopenharmony_ci 13453af6ab5fSopenharmony_ciCurrently, |LANG| does not support template literals. You may use a ``+`` 13463af6ab5fSopenharmony_ciconcatenation as a work-around. 13473af6ab5fSopenharmony_ci 13483af6ab5fSopenharmony_ci|CB_BAD| 13493af6ab5fSopenharmony_ci~~~~~~~~ 13503af6ab5fSopenharmony_ci 13513af6ab5fSopenharmony_ci.. code-block:: typescript 13523af6ab5fSopenharmony_ci 13533af6ab5fSopenharmony_ci const a = 5 13543af6ab5fSopenharmony_ci const b = 10 13553af6ab5fSopenharmony_ci console.log(`Fifteen is ${a + b}`) 13563af6ab5fSopenharmony_ci 13573af6ab5fSopenharmony_ci|CB_OK| 13583af6ab5fSopenharmony_ci~~~~~~~ 13593af6ab5fSopenharmony_ci 13603af6ab5fSopenharmony_ci.. code-block:: typescript 13613af6ab5fSopenharmony_ci 13623af6ab5fSopenharmony_ci const a = 5 13633af6ab5fSopenharmony_ci const b = 10 13643af6ab5fSopenharmony_ci 13653af6ab5fSopenharmony_ci // (a + b) is converted to Int and then toString() method is called: 13663af6ab5fSopenharmony_ci console.log("Fifteen is " + (a + b)) 13673af6ab5fSopenharmony_ci 13683af6ab5fSopenharmony_ci.. _R045: 13693af6ab5fSopenharmony_ci 13703af6ab5fSopenharmony_ci|CB_R| #45: Lambdas require explicit type annotation for parameters 13713af6ab5fSopenharmony_ci------------------------------------------------------------------- 13723af6ab5fSopenharmony_ci 13733af6ab5fSopenharmony_ci|CB_RULE| 13743af6ab5fSopenharmony_ci~~~~~~~~~ 13753af6ab5fSopenharmony_ci 13763af6ab5fSopenharmony_ciCurrently, |LANG| requires the types of lambda parameters 13773af6ab5fSopenharmony_cito be explicitly specified. 13783af6ab5fSopenharmony_ci 13793af6ab5fSopenharmony_ci|CB_BAD| 13803af6ab5fSopenharmony_ci~~~~~~~~ 13813af6ab5fSopenharmony_ci 13823af6ab5fSopenharmony_ci.. code-block:: typescript 13833af6ab5fSopenharmony_ci 13843af6ab5fSopenharmony_ci let f = (s) => { // type any is assumed 13853af6ab5fSopenharmony_ci console.log(s) 13863af6ab5fSopenharmony_ci } 13873af6ab5fSopenharmony_ci 13883af6ab5fSopenharmony_ci|CB_OK| 13893af6ab5fSopenharmony_ci~~~~~~~ 13903af6ab5fSopenharmony_ci 13913af6ab5fSopenharmony_ciExplicit types for lambda parameters are mandatory. 13923af6ab5fSopenharmony_ci 13933af6ab5fSopenharmony_ci.. code-block:: typescript 13943af6ab5fSopenharmony_ci 13953af6ab5fSopenharmony_ci let f = 13963af6ab5fSopenharmony_ci (s: string) => { 13973af6ab5fSopenharmony_ci console.log(s) 13983af6ab5fSopenharmony_ci } 13993af6ab5fSopenharmony_ci 14003af6ab5fSopenharmony_ci|CB_SEE| 14013af6ab5fSopenharmony_ci~~~~~~~~ 14023af6ab5fSopenharmony_ci 14033af6ab5fSopenharmony_ci* :ref:`R047` 14043af6ab5fSopenharmony_ci 14053af6ab5fSopenharmony_ci.. _R046: 14063af6ab5fSopenharmony_ci 14073af6ab5fSopenharmony_ci|CB_R| #46: Use arrow functions instead of function expressions 14083af6ab5fSopenharmony_ci------------------------------------------------------------------- 14093af6ab5fSopenharmony_ci 14103af6ab5fSopenharmony_ci|CB_RULE| 14113af6ab5fSopenharmony_ci~~~~~~~~~ 14123af6ab5fSopenharmony_ci 14133af6ab5fSopenharmony_ci|LANG| does not support function expressions, use arrow functions instead 14143af6ab5fSopenharmony_cito be explicitly specified. 14153af6ab5fSopenharmony_ci 14163af6ab5fSopenharmony_ci|CB_BAD| 14173af6ab5fSopenharmony_ci~~~~~~~~ 14183af6ab5fSopenharmony_ci 14193af6ab5fSopenharmony_ci.. code-block:: typescript 14203af6ab5fSopenharmony_ci 14213af6ab5fSopenharmony_ci let f = function (s: string) { 14223af6ab5fSopenharmony_ci console.log(s) 14233af6ab5fSopenharmony_ci } 14243af6ab5fSopenharmony_ci 14253af6ab5fSopenharmony_ci|CB_OK| 14263af6ab5fSopenharmony_ci~~~~~~~ 14273af6ab5fSopenharmony_ci 14283af6ab5fSopenharmony_ci.. code-block:: typescript 14293af6ab5fSopenharmony_ci 14303af6ab5fSopenharmony_ci let f = (s: string) => { 14313af6ab5fSopenharmony_ci console.log(s) 14323af6ab5fSopenharmony_ci } 14333af6ab5fSopenharmony_ci 14343af6ab5fSopenharmony_ci.. _R047: 14353af6ab5fSopenharmony_ci 14363af6ab5fSopenharmony_ci|CB_R| #47: Return type must be specified for lambdas explicitly 14373af6ab5fSopenharmony_ci---------------------------------------------------------------- 14383af6ab5fSopenharmony_ci 14393af6ab5fSopenharmony_ci|CB_RULE| 14403af6ab5fSopenharmony_ci~~~~~~~~~ 14413af6ab5fSopenharmony_ci 14423af6ab5fSopenharmony_ciAn explicit return type is mandatory for a lambda expression. 14433af6ab5fSopenharmony_ci 14443af6ab5fSopenharmony_ci|CB_BAD| 14453af6ab5fSopenharmony_ci~~~~~~~~ 14463af6ab5fSopenharmony_ci 14473af6ab5fSopenharmony_ci.. code-block:: typescript 14483af6ab5fSopenharmony_ci 14493af6ab5fSopenharmony_ci let f = (s: string) => { // return type is implicit 14503af6ab5fSopenharmony_ci return s.toLowerCase() 14513af6ab5fSopenharmony_ci } 14523af6ab5fSopenharmony_ci 14533af6ab5fSopenharmony_ci|CB_OK| 14543af6ab5fSopenharmony_ci~~~~~~~ 14553af6ab5fSopenharmony_ci 14563af6ab5fSopenharmony_ci.. code-block:: typescript 14573af6ab5fSopenharmony_ci 14583af6ab5fSopenharmony_ci let f = (s: string): string => { // return type is explicit 14593af6ab5fSopenharmony_ci return s.toLowerCase() 14603af6ab5fSopenharmony_ci } 14613af6ab5fSopenharmony_ci 14623af6ab5fSopenharmony_ci|CB_SEE| 14633af6ab5fSopenharmony_ci~~~~~~~~ 14643af6ab5fSopenharmony_ci 14653af6ab5fSopenharmony_ci* :ref:`R045` 14663af6ab5fSopenharmony_ci 14673af6ab5fSopenharmony_ci.. _R049: 14683af6ab5fSopenharmony_ci 14693af6ab5fSopenharmony_ci|CB_R| #49: Usage of arrow function with type assertions or generics 14703af6ab5fSopenharmony_ci-------------------------------------------------------------------- 14713af6ab5fSopenharmony_ci 14723af6ab5fSopenharmony_ci|CB_BAD| 14733af6ab5fSopenharmony_ci~~~~~~~~ 14743af6ab5fSopenharmony_ci 14753af6ab5fSopenharmony_ciA non-compliant syntax is used. Not a part of the common subset. 14763af6ab5fSopenharmony_ci 14773af6ab5fSopenharmony_ci.. code-block:: typescript 14783af6ab5fSopenharmony_ci 14793af6ab5fSopenharmony_ci let generic_arrow_func = 14803af6ab5fSopenharmony_ci <T extends String> (x: T) => { return x } 14813af6ab5fSopenharmony_ci let type_asserted_function = 14823af6ab5fSopenharmony_ci <() => boolean> (() => {return true}) 14833af6ab5fSopenharmony_ci 14843af6ab5fSopenharmony_ci generic_arrow_func(5) // Compile-time error 14853af6ab5fSopenharmony_ci generic_arrow_func("string") 14863af6ab5fSopenharmony_ci type_asserted_function() 14873af6ab5fSopenharmony_ci 14883af6ab5fSopenharmony_ci|CB_OK| 14893af6ab5fSopenharmony_ci~~~~~~~ 14903af6ab5fSopenharmony_ci 14913af6ab5fSopenharmony_ciIntroduce a new function to replace an arrow function with generics. 14923af6ab5fSopenharmony_ciExplicit types are mandatory, static typing replaces type assertions by design. 14933af6ab5fSopenharmony_ci 14943af6ab5fSopenharmony_ci.. code-block:: typescript 14953af6ab5fSopenharmony_ci 14963af6ab5fSopenharmony_ci function generic_arrow_func<T extends String>(x: T): T { 14973af6ab5fSopenharmony_ci return x 14983af6ab5fSopenharmony_ci } 14993af6ab5fSopenharmony_ci 15003af6ab5fSopenharmony_ci let type_asserted_func: () => boolean = 15013af6ab5fSopenharmony_ci (): boolean => {return true} 15023af6ab5fSopenharmony_ci 15033af6ab5fSopenharmony_ci generic_arrow_func(5) // Compile-time error 15043af6ab5fSopenharmony_ci generic_arrow_func("string") 15053af6ab5fSopenharmony_ci 15063af6ab5fSopenharmony_ci type_asserted_func() 15073af6ab5fSopenharmony_ci 15083af6ab5fSopenharmony_ci.. _R050: 15093af6ab5fSopenharmony_ci 15103af6ab5fSopenharmony_ci|CB_R| #50: Class literals are not supported 15113af6ab5fSopenharmony_ci-------------------------------------------- 15123af6ab5fSopenharmony_ci 15133af6ab5fSopenharmony_ci|CB_RULE| 15143af6ab5fSopenharmony_ci~~~~~~~~~ 15153af6ab5fSopenharmony_ci 15163af6ab5fSopenharmony_ci|LANG| does not support class literals. A new named class type must be 15173af6ab5fSopenharmony_ciintroduced explicitly. 15183af6ab5fSopenharmony_ci 15193af6ab5fSopenharmony_ci|CB_BAD| 15203af6ab5fSopenharmony_ci~~~~~~~~ 15213af6ab5fSopenharmony_ci 15223af6ab5fSopenharmony_ci.. code-block:: typescript 15233af6ab5fSopenharmony_ci 15243af6ab5fSopenharmony_ci const Rectangle = class { 15253af6ab5fSopenharmony_ci constructor(height: number, width: number) { 15263af6ab5fSopenharmony_ci this.heigth = height 15273af6ab5fSopenharmony_ci this.width = width 15283af6ab5fSopenharmony_ci } 15293af6ab5fSopenharmony_ci 15303af6ab5fSopenharmony_ci heigth 15313af6ab5fSopenharmony_ci width 15323af6ab5fSopenharmony_ci } 15333af6ab5fSopenharmony_ci 15343af6ab5fSopenharmony_ci const rectangle = new Rectangle(0.0, 0.0) 15353af6ab5fSopenharmony_ci 15363af6ab5fSopenharmony_ci|CB_OK| 15373af6ab5fSopenharmony_ci~~~~~~~ 15383af6ab5fSopenharmony_ci 15393af6ab5fSopenharmony_ci.. code-block:: typescript 15403af6ab5fSopenharmony_ci 15413af6ab5fSopenharmony_ci class Rectangle { 15423af6ab5fSopenharmony_ci constructor(height: number, width: number) { 15433af6ab5fSopenharmony_ci this.heigth = height 15443af6ab5fSopenharmony_ci this.width = width 15453af6ab5fSopenharmony_ci } 15463af6ab5fSopenharmony_ci 15473af6ab5fSopenharmony_ci heigth: number 15483af6ab5fSopenharmony_ci width: number 15493af6ab5fSopenharmony_ci } 15503af6ab5fSopenharmony_ci 15513af6ab5fSopenharmony_ci const rectangle = new Rectangle(0.0, 0.0) 15523af6ab5fSopenharmony_ci 15533af6ab5fSopenharmony_ci.. _R051: 15543af6ab5fSopenharmony_ci 15553af6ab5fSopenharmony_ci|CB_R| #51: Classes cannot be specified in ``implements`` clause 15563af6ab5fSopenharmony_ci---------------------------------------------------------------- 15573af6ab5fSopenharmony_ci 15583af6ab5fSopenharmony_ci|CB_RULE| 15593af6ab5fSopenharmony_ci~~~~~~~~~ 15603af6ab5fSopenharmony_ci 15613af6ab5fSopenharmony_ci|LANG| does not allow to specify a class in implements clause. Only interfaces may be specified. 15623af6ab5fSopenharmony_ci 15633af6ab5fSopenharmony_ci|CB_BAD| 15643af6ab5fSopenharmony_ci~~~~~~~~ 15653af6ab5fSopenharmony_ci 15663af6ab5fSopenharmony_ci.. code-block:: typescript 15673af6ab5fSopenharmony_ci 15683af6ab5fSopenharmony_ci class C { 15693af6ab5fSopenharmony_ci foo() {} 15703af6ab5fSopenharmony_ci } 15713af6ab5fSopenharmony_ci 15723af6ab5fSopenharmony_ci class C1 implements C { 15733af6ab5fSopenharmony_ci foo() {} 15743af6ab5fSopenharmony_ci } 15753af6ab5fSopenharmony_ci 15763af6ab5fSopenharmony_ci|CB_OK| 15773af6ab5fSopenharmony_ci~~~~~~~ 15783af6ab5fSopenharmony_ci 15793af6ab5fSopenharmony_ci.. code-block:: typescript 15803af6ab5fSopenharmony_ci 15813af6ab5fSopenharmony_ci interface C { 15823af6ab5fSopenharmony_ci foo() 15833af6ab5fSopenharmony_ci } 15843af6ab5fSopenharmony_ci 15853af6ab5fSopenharmony_ci class C1 implements C { 15863af6ab5fSopenharmony_ci foo() {} 15873af6ab5fSopenharmony_ci } 15883af6ab5fSopenharmony_ci 15893af6ab5fSopenharmony_ci 15903af6ab5fSopenharmony_ci.. _R052: 15913af6ab5fSopenharmony_ci 15923af6ab5fSopenharmony_ci|CB_R| #52: Attempt to access an undefined property is a compile-time error 15933af6ab5fSopenharmony_ci--------------------------------------------------------------------------- 15943af6ab5fSopenharmony_ci 15953af6ab5fSopenharmony_ci|CB_RULE| 15963af6ab5fSopenharmony_ci~~~~~~~~~ 15973af6ab5fSopenharmony_ci 15983af6ab5fSopenharmony_ci|LANG| supports accessing only those class properties that are either declared 15993af6ab5fSopenharmony_ciin the class, or accessible via inheritance. Accessing any other properties is 16003af6ab5fSopenharmony_ciprohibited and causes compile-time errors. 16013af6ab5fSopenharmony_ci 16023af6ab5fSopenharmony_ci|CB_BAD| 16033af6ab5fSopenharmony_ci~~~~~~~~ 16043af6ab5fSopenharmony_ci 16053af6ab5fSopenharmony_ci.. code-block:: typescript 16063af6ab5fSopenharmony_ci 16073af6ab5fSopenharmony_ci let person = {name: "Bob", isEmployee: true} 16083af6ab5fSopenharmony_ci 16093af6ab5fSopenharmony_ci let n = typ["name"] 16103af6ab5fSopenharmony_ci let e = typ["isEmployee"] 16113af6ab5fSopenharmony_ci let s = typ["office"] // undefined 16123af6ab5fSopenharmony_ci 16133af6ab5fSopenharmony_ci|CB_OK| 16143af6ab5fSopenharmony_ci~~~~~~~ 16153af6ab5fSopenharmony_ci 16163af6ab5fSopenharmony_ciUse proper types to check property existence during compilation. 16173af6ab5fSopenharmony_ci 16183af6ab5fSopenharmony_ci.. code-block:: typescript 16193af6ab5fSopenharmony_ci 16203af6ab5fSopenharmony_ci class Person { 16213af6ab5fSopenharmony_ci constructor(name: string, isEmployee: boolean) { 16223af6ab5fSopenharmony_ci this.name = name 16233af6ab5fSopenharmony_ci this.isEmployee = isEmployee 16243af6ab5fSopenharmony_ci } 16253af6ab5fSopenharmony_ci 16263af6ab5fSopenharmony_ci name: string 16273af6ab5fSopenharmony_ci isEmployee: boolean 16283af6ab5fSopenharmony_ci } 16293af6ab5fSopenharmony_ci 16303af6ab5fSopenharmony_ci let person = new Person("Bob", true) 16313af6ab5fSopenharmony_ci let n = typ.name 16323af6ab5fSopenharmony_ci let e = typ.isEmployee 16333af6ab5fSopenharmony_ci let s = typ.office // Compile-time error 16343af6ab5fSopenharmony_ci 16353af6ab5fSopenharmony_ci|CB_SEE| 16363af6ab5fSopenharmony_ci~~~~~~~~ 16373af6ab5fSopenharmony_ci 16383af6ab5fSopenharmony_ci* :ref:`R001` 16393af6ab5fSopenharmony_ci* :ref:`R002` 16403af6ab5fSopenharmony_ci* :ref:`R059` 16413af6ab5fSopenharmony_ci* :ref:`R060` 16423af6ab5fSopenharmony_ci* :ref:`R066` 16433af6ab5fSopenharmony_ci* :ref:`R105` 16443af6ab5fSopenharmony_ci* :ref:`R109` 16453af6ab5fSopenharmony_ci 16463af6ab5fSopenharmony_ci.. _R053: 16473af6ab5fSopenharmony_ci 16483af6ab5fSopenharmony_ci|CB_R| #53: Only ``as T`` syntax is supported for type casts 16493af6ab5fSopenharmony_ci------------------------------------------------------------ 16503af6ab5fSopenharmony_ci 16513af6ab5fSopenharmony_ci|CB_RULE| 16523af6ab5fSopenharmony_ci~~~~~~~~~ 16533af6ab5fSopenharmony_ci 16543af6ab5fSopenharmony_ci|LANG| supports ``as`` keyword as the only syntax for type casts. 16553af6ab5fSopenharmony_ciIncorrect cast causes a compile-time error or runtime ``ClassCastError``. 16563af6ab5fSopenharmony_ci``<type>`` syntax for type casts is not supported. 16573af6ab5fSopenharmony_ci 16583af6ab5fSopenharmony_ci|CB_BAD| 16593af6ab5fSopenharmony_ci~~~~~~~~ 16603af6ab5fSopenharmony_ci 16613af6ab5fSopenharmony_ci.. code-block:: typescript 16623af6ab5fSopenharmony_ci 16633af6ab5fSopenharmony_ci class Shape {} 16643af6ab5fSopenharmony_ci class Circle extends Shape {x: number = 5} 16653af6ab5fSopenharmony_ci class Square extends Shape {y: string = "a"} 16663af6ab5fSopenharmony_ci 16673af6ab5fSopenharmony_ci function createShape(): Shape { 16683af6ab5fSopenharmony_ci return new Circle() 16693af6ab5fSopenharmony_ci } 16703af6ab5fSopenharmony_ci 16713af6ab5fSopenharmony_ci let c1 = <Circle> createShape() 16723af6ab5fSopenharmony_ci 16733af6ab5fSopenharmony_ci let c2 = createShape() as Circle 16743af6ab5fSopenharmony_ci 16753af6ab5fSopenharmony_ci // No report is provided during compilation 16763af6ab5fSopenharmony_ci // nor during runtime if cast is wrong: 16773af6ab5fSopenharmony_ci let c3 = createShape() as Square 16783af6ab5fSopenharmony_ci console.log(c3.y) // undefined 16793af6ab5fSopenharmony_ci 16803af6ab5fSopenharmony_ci|CB_OK| 16813af6ab5fSopenharmony_ci~~~~~~~ 16823af6ab5fSopenharmony_ci 16833af6ab5fSopenharmony_ci.. code-block:: typescript 16843af6ab5fSopenharmony_ci 16853af6ab5fSopenharmony_ci class Shape {} 16863af6ab5fSopenharmony_ci class Circle extends Shape {x: number = 5} 16873af6ab5fSopenharmony_ci class Square extends Shape {y: string = "a"} 16883af6ab5fSopenharmony_ci 16893af6ab5fSopenharmony_ci function createShape(): Shape { 16903af6ab5fSopenharmony_ci return new Circle() 16913af6ab5fSopenharmony_ci } 16923af6ab5fSopenharmony_ci 16933af6ab5fSopenharmony_ci let c2 = createShape() as Circle 16943af6ab5fSopenharmony_ci 16953af6ab5fSopenharmony_ci // ClassCastError during runtime is thrown: 16963af6ab5fSopenharmony_ci let c3 = createShape() as Square 16973af6ab5fSopenharmony_ci 16983af6ab5fSopenharmony_ci.. _R054: 16993af6ab5fSopenharmony_ci 17003af6ab5fSopenharmony_ci|CB_R| #54: JSX expressions are not supported 17013af6ab5fSopenharmony_ci--------------------------------------------- 17023af6ab5fSopenharmony_ci 17033af6ab5fSopenharmony_ci|CB_RULE| 17043af6ab5fSopenharmony_ci~~~~~~~~~ 17053af6ab5fSopenharmony_ci 17063af6ab5fSopenharmony_ciDo not use JSX since no alternative is provided to rewrite it. 17073af6ab5fSopenharmony_ci 17083af6ab5fSopenharmony_ci.. _R055: 17093af6ab5fSopenharmony_ci 17103af6ab5fSopenharmony_ci|CB_R| #55: Unary operators ``+``, ``-`` and ``~`` work only on numbers 17113af6ab5fSopenharmony_ci----------------------------------------------------------------------- 17123af6ab5fSopenharmony_ci 17133af6ab5fSopenharmony_ci|CB_RULE| 17143af6ab5fSopenharmony_ci~~~~~~~~~ 17153af6ab5fSopenharmony_ci 17163af6ab5fSopenharmony_ci|LANG| allows unary operators to work on numeric types only. A compile-time 17173af6ab5fSopenharmony_cierror occurs if these operators are applied to a non-numeric type. Unlike in 17183af6ab5fSopenharmony_ci|TS|, implicit casting of strings in this context is not supported and must 17193af6ab5fSopenharmony_cibe done explicitly. 17203af6ab5fSopenharmony_ci 17213af6ab5fSopenharmony_ci|CB_BAD| 17223af6ab5fSopenharmony_ci~~~~~~~~ 17233af6ab5fSopenharmony_ci 17243af6ab5fSopenharmony_ci.. code-block:: typescript 17253af6ab5fSopenharmony_ci 17263af6ab5fSopenharmony_ci let a = +5 // 5 as number 17273af6ab5fSopenharmony_ci let b = +"5" // 5 as number 17283af6ab5fSopenharmony_ci let c = -5 // -5 as number 17293af6ab5fSopenharmony_ci let d = -"5" // -5 as number 17303af6ab5fSopenharmony_ci let e = ~5 // -6 as number 17313af6ab5fSopenharmony_ci let f = ~"5" // -6 as number 17323af6ab5fSopenharmony_ci let g = +"string" // NaN as number 17333af6ab5fSopenharmony_ci 17343af6ab5fSopenharmony_ci|CB_OK| 17353af6ab5fSopenharmony_ci~~~~~~~ 17363af6ab5fSopenharmony_ci 17373af6ab5fSopenharmony_ci.. code-block:: typescript 17383af6ab5fSopenharmony_ci 17393af6ab5fSopenharmony_ci let a = +5 // 5 as int 17403af6ab5fSopenharmony_ci let b = +"5" // Compile-time error 17413af6ab5fSopenharmony_ci let c = -5 // -5 as int 17423af6ab5fSopenharmony_ci let d = -"5" // Compile-time error 17433af6ab5fSopenharmony_ci let e = ~5 // -6 as int 17443af6ab5fSopenharmony_ci let f = ~"5" // Compile-time error 17453af6ab5fSopenharmony_ci let g = +"string" // Compile-time error 17463af6ab5fSopenharmony_ci 17473af6ab5fSopenharmony_ci|CB_SEE| 17483af6ab5fSopenharmony_ci~~~~~~~~ 17493af6ab5fSopenharmony_ci 17503af6ab5fSopenharmony_ci* :ref:`R055` 17513af6ab5fSopenharmony_ci* :ref:`R057` 17523af6ab5fSopenharmony_ci* :ref:`R061` 17533af6ab5fSopenharmony_ci* :ref:`R062` 17543af6ab5fSopenharmony_ci* :ref:`R063` 17553af6ab5fSopenharmony_ci* :ref:`R064` 17563af6ab5fSopenharmony_ci* :ref:`R067` 17573af6ab5fSopenharmony_ci* :ref:`R068` 17583af6ab5fSopenharmony_ci* :ref:`R078` 17593af6ab5fSopenharmony_ci 17603af6ab5fSopenharmony_ci.. _R056: 17613af6ab5fSopenharmony_ci 17623af6ab5fSopenharmony_ci|CB_R| #56: Unary ``+`` cannot be used for casting to ``number`` 17633af6ab5fSopenharmony_ci---------------------------------------------------------------- 17643af6ab5fSopenharmony_ci 17653af6ab5fSopenharmony_ci|CB_RULE| 17663af6ab5fSopenharmony_ci~~~~~~~~~ 17673af6ab5fSopenharmony_ci 17683af6ab5fSopenharmony_ci|LANG| does not support casting from any type to a numeric type 17693af6ab5fSopenharmony_ciby using the unary ``+`` operator, which can be applied only to 17703af6ab5fSopenharmony_cinumeric types. 17713af6ab5fSopenharmony_ci 17723af6ab5fSopenharmony_ci|CB_BAD| 17733af6ab5fSopenharmony_ci~~~~~~~~ 17743af6ab5fSopenharmony_ci 17753af6ab5fSopenharmony_ci.. code-block:: typescript 17763af6ab5fSopenharmony_ci 17773af6ab5fSopenharmony_ci function returnTen(): string { 17783af6ab5fSopenharmony_ci return "-10" 17793af6ab5fSopenharmony_ci } 17803af6ab5fSopenharmony_ci 17813af6ab5fSopenharmony_ci function returnString(): string { 17823af6ab5fSopenharmony_ci return "string" 17833af6ab5fSopenharmony_ci } 17843af6ab5fSopenharmony_ci 17853af6ab5fSopenharmony_ci let a = +returnTen() // -10 as number 17863af6ab5fSopenharmony_ci let b = +returnString() // NaN 17873af6ab5fSopenharmony_ci 17883af6ab5fSopenharmony_ci|CB_OK| 17893af6ab5fSopenharmony_ci~~~~~~~ 17903af6ab5fSopenharmony_ci 17913af6ab5fSopenharmony_ci.. code-block:: typescript 17923af6ab5fSopenharmony_ci 17933af6ab5fSopenharmony_ci function returnTen(): string { 17943af6ab5fSopenharmony_ci return "-10" 17953af6ab5fSopenharmony_ci } 17963af6ab5fSopenharmony_ci 17973af6ab5fSopenharmony_ci function returnString(): string { 17983af6ab5fSopenharmony_ci return "string" 17993af6ab5fSopenharmony_ci } 18003af6ab5fSopenharmony_ci 18013af6ab5fSopenharmony_ci let a = +returnTen() // Compile-time error 18023af6ab5fSopenharmony_ci let b = +returnString() // Compile-time error 18033af6ab5fSopenharmony_ci 18043af6ab5fSopenharmony_ci|CB_SEE| 18053af6ab5fSopenharmony_ci~~~~~~~~ 18063af6ab5fSopenharmony_ci 18073af6ab5fSopenharmony_ci* :ref:`R055` 18083af6ab5fSopenharmony_ci* :ref:`R057` 18093af6ab5fSopenharmony_ci* :ref:`R061` 18103af6ab5fSopenharmony_ci* :ref:`R062` 18113af6ab5fSopenharmony_ci* :ref:`R063` 18123af6ab5fSopenharmony_ci* :ref:`R064` 18133af6ab5fSopenharmony_ci* :ref:`R067` 18143af6ab5fSopenharmony_ci* :ref:`R068` 18153af6ab5fSopenharmony_ci* :ref:`R078` 18163af6ab5fSopenharmony_ci 18173af6ab5fSopenharmony_ci.. _R057: 18183af6ab5fSopenharmony_ci 18193af6ab5fSopenharmony_ci|CB_R| #57: ``!`` operator works only on values of the boolean type 18203af6ab5fSopenharmony_ci------------------------------------------------------------------- 18213af6ab5fSopenharmony_ci 18223af6ab5fSopenharmony_ci|CB_RULE| 18233af6ab5fSopenharmony_ci~~~~~~~~~ 18243af6ab5fSopenharmony_ci 18253af6ab5fSopenharmony_ci|LANG| supports using ``!`` operator only for values of the boolean type. 18263af6ab5fSopenharmony_ciExplicit cast from some type to the boolean (or Boolean) is mandatory. 18273af6ab5fSopenharmony_ciImplicit casts are prohibited and cause compile-time errors. 18283af6ab5fSopenharmony_ci 18293af6ab5fSopenharmony_ci|CB_BAD| 18303af6ab5fSopenharmony_ci~~~~~~~~ 18313af6ab5fSopenharmony_ci 18323af6ab5fSopenharmony_ci.. code-block:: typescript 18333af6ab5fSopenharmony_ci 18343af6ab5fSopenharmony_ci let a = !true // false 18353af6ab5fSopenharmony_ci let b = !"true" // false 18363af6ab5fSopenharmony_ci let c = !"rnd_str" // false 18373af6ab5fSopenharmony_ci let d = !"false" // false 18383af6ab5fSopenharmony_ci let e = !5 // false 18393af6ab5fSopenharmony_ci let f = !0 // true 18403af6ab5fSopenharmony_ci 18413af6ab5fSopenharmony_ci|CB_OK| 18423af6ab5fSopenharmony_ci~~~~~~~ 18433af6ab5fSopenharmony_ci 18443af6ab5fSopenharmony_ci.. code-block:: typescript 18453af6ab5fSopenharmony_ci 18463af6ab5fSopenharmony_ci let a = !true // false 18473af6ab5fSopenharmony_ci let b = !"true" // Compile-time error 18483af6ab5fSopenharmony_ci let c = !"false" // Compile-time error 18493af6ab5fSopenharmony_ci let d = !"rnd_str" // Compile-time error 18503af6ab5fSopenharmony_ci let e = !5 // Compile-time error 18513af6ab5fSopenharmony_ci let f = !0 // Compile-time error 18523af6ab5fSopenharmony_ci 18533af6ab5fSopenharmony_ci|CB_SEE| 18543af6ab5fSopenharmony_ci~~~~~~~~ 18553af6ab5fSopenharmony_ci 18563af6ab5fSopenharmony_ci* :ref:`R055` 18573af6ab5fSopenharmony_ci* :ref:`R056` 18583af6ab5fSopenharmony_ci* :ref:`R061` 18593af6ab5fSopenharmony_ci* :ref:`R062` 18603af6ab5fSopenharmony_ci* :ref:`R063` 18613af6ab5fSopenharmony_ci* :ref:`R064` 18623af6ab5fSopenharmony_ci* :ref:`R067` 18633af6ab5fSopenharmony_ci* :ref:`R068` 18643af6ab5fSopenharmony_ci* :ref:`R078` 18653af6ab5fSopenharmony_ci 18663af6ab5fSopenharmony_ci.. _R059: 18673af6ab5fSopenharmony_ci 18683af6ab5fSopenharmony_ci|CB_R| #59: ``delete`` operator is not supported 18693af6ab5fSopenharmony_ci------------------------------------------------ 18703af6ab5fSopenharmony_ci 18713af6ab5fSopenharmony_ci|CB_RULE| 18723af6ab5fSopenharmony_ci~~~~~~~~~ 18733af6ab5fSopenharmony_ci 18743af6ab5fSopenharmony_ci|LANG| assumes that object layout is known at compile time and cannot be 18753af6ab5fSopenharmony_cichanged at runtime. Thus the operation of deleting a property makes no sense. 18763af6ab5fSopenharmony_ci 18773af6ab5fSopenharmony_ci|CB_BAD| 18783af6ab5fSopenharmony_ci~~~~~~~~ 18793af6ab5fSopenharmony_ci 18803af6ab5fSopenharmony_ci.. code-block:: typescript 18813af6ab5fSopenharmony_ci 18823af6ab5fSopenharmony_ci class Point { 18833af6ab5fSopenharmony_ci x?: number = 0.0 18843af6ab5fSopenharmony_ci y?: number = 0.0 18853af6ab5fSopenharmony_ci } 18863af6ab5fSopenharmony_ci 18873af6ab5fSopenharmony_ci let p = new Point() 18883af6ab5fSopenharmony_ci delete p.y 18893af6ab5fSopenharmony_ci 18903af6ab5fSopenharmony_ci|CB_OK| 18913af6ab5fSopenharmony_ci~~~~~~~ 18923af6ab5fSopenharmony_ci 18933af6ab5fSopenharmony_ci.. code-block:: typescript 18943af6ab5fSopenharmony_ci 18953af6ab5fSopenharmony_ci // To mimic the original semantics, you may declare a nullable type 18963af6ab5fSopenharmony_ci // and assign null to mark value absence: 18973af6ab5fSopenharmony_ci 18983af6ab5fSopenharmony_ci class Point { 18993af6ab5fSopenharmony_ci x: number | null 19003af6ab5fSopenharmony_ci y: number | null 19013af6ab5fSopenharmony_ci } 19023af6ab5fSopenharmony_ci 19033af6ab5fSopenharmony_ci let p = new Point() 19043af6ab5fSopenharmony_ci p.y = null 19053af6ab5fSopenharmony_ci 19063af6ab5fSopenharmony_ci|CB_SEE| 19073af6ab5fSopenharmony_ci~~~~~~~~ 19083af6ab5fSopenharmony_ci 19093af6ab5fSopenharmony_ci* :ref:`R001` 19103af6ab5fSopenharmony_ci* :ref:`R002` 19113af6ab5fSopenharmony_ci* :ref:`R052` 19123af6ab5fSopenharmony_ci* :ref:`R060` 19133af6ab5fSopenharmony_ci* :ref:`R066` 19143af6ab5fSopenharmony_ci* :ref:`R105` 19153af6ab5fSopenharmony_ci* :ref:`R109` 19163af6ab5fSopenharmony_ci 19173af6ab5fSopenharmony_ci.. _R060: 19183af6ab5fSopenharmony_ci 19193af6ab5fSopenharmony_ci|CB_R| #60: ``typeof`` is allowed only in expression contexts 19203af6ab5fSopenharmony_ci------------------------------------------------------------- 19213af6ab5fSopenharmony_ci 19223af6ab5fSopenharmony_ci|CB_RULE| 19233af6ab5fSopenharmony_ci~~~~~~~~~ 19243af6ab5fSopenharmony_ci 19253af6ab5fSopenharmony_ci|LANG| supports ``typeof`` operator only in the expression context. 19263af6ab5fSopenharmony_ciType notation with ``typeof`` is not supported. 19273af6ab5fSopenharmony_ci 19283af6ab5fSopenharmony_ci|CB_BAD| 19293af6ab5fSopenharmony_ci~~~~~~~~ 19303af6ab5fSopenharmony_ci 19313af6ab5fSopenharmony_ci.. code-block:: typescript 19323af6ab5fSopenharmony_ci 19333af6ab5fSopenharmony_ci let n1 = 42 19343af6ab5fSopenharmony_ci let s1 = "foo" 19353af6ab5fSopenharmony_ci console.log(typeof n1) // "number" 19363af6ab5fSopenharmony_ci console.log(typeof s1) // "string" 19373af6ab5fSopenharmony_ci let n2: typeof n1 19383af6ab5fSopenharmony_ci let s2: typeof s1 19393af6ab5fSopenharmony_ci 19403af6ab5fSopenharmony_ci|CB_OK| 19413af6ab5fSopenharmony_ci~~~~~~~ 19423af6ab5fSopenharmony_ci 19433af6ab5fSopenharmony_ci.. code-block:: typescript 19443af6ab5fSopenharmony_ci 19453af6ab5fSopenharmony_ci let n1 = 42 19463af6ab5fSopenharmony_ci let s1 = "foo" 19473af6ab5fSopenharmony_ci console.log(typeof n1) // "number" 19483af6ab5fSopenharmony_ci console.log(typeof s1) // "string" 19493af6ab5fSopenharmony_ci let n2: number 19503af6ab5fSopenharmony_ci let s2: string 19513af6ab5fSopenharmony_ci 19523af6ab5fSopenharmony_ci|CB_SEE| 19533af6ab5fSopenharmony_ci~~~~~~~~ 19543af6ab5fSopenharmony_ci 19553af6ab5fSopenharmony_ci* :ref:`R001` 19563af6ab5fSopenharmony_ci* :ref:`R002` 19573af6ab5fSopenharmony_ci* :ref:`R052` 19583af6ab5fSopenharmony_ci* :ref:`R059` 19593af6ab5fSopenharmony_ci* :ref:`R066` 19603af6ab5fSopenharmony_ci* :ref:`R105` 19613af6ab5fSopenharmony_ci* :ref:`R109` 19623af6ab5fSopenharmony_ci 19633af6ab5fSopenharmony_ci.. _R061: 19643af6ab5fSopenharmony_ci 19653af6ab5fSopenharmony_ci|CB_R| #61: Binary operators ``*``, ``/``, ``%``, ``-``, ``<<``, ``>>``, ``>>>``, ``&``, ``^`` and ``|`` work only on numeric types 19663af6ab5fSopenharmony_ci----------------------------------------------------------------------------------------------------------------------------------- 19673af6ab5fSopenharmony_ci 19683af6ab5fSopenharmony_ci|CB_RULE| 19693af6ab5fSopenharmony_ci~~~~~~~~~ 19703af6ab5fSopenharmony_ci 19713af6ab5fSopenharmony_ci|LANG| allows applying binary operators ``*``, ``/``, ``%``, ``-``, ``<<``, 19723af6ab5fSopenharmony_ci``>>``, ``>>>``, ``&``, ``^`` and ``|`` only to values of numeric types. 19733af6ab5fSopenharmony_ciImplicit casts from other types to numeric types are prohibited and cause 19743af6ab5fSopenharmony_cicompile-time errors. 19753af6ab5fSopenharmony_ci 19763af6ab5fSopenharmony_ci|CB_BAD| 19773af6ab5fSopenharmony_ci~~~~~~~~ 19783af6ab5fSopenharmony_ci 19793af6ab5fSopenharmony_ci.. code-block:: typescript 19803af6ab5fSopenharmony_ci 19813af6ab5fSopenharmony_ci let a = (5 & 5) // 5 19823af6ab5fSopenharmony_ci let b = (5.5 & 5.5) // 5, not 5.5 19833af6ab5fSopenharmony_ci let c = (5 | 5) // 5 19843af6ab5fSopenharmony_ci let d = (5.5 | 5.5) // 5, not 5.5 19853af6ab5fSopenharmony_ci 19863af6ab5fSopenharmony_ci enum Direction { 19873af6ab5fSopenharmony_ci Up = -1, 19883af6ab5fSopenharmony_ci Down 19893af6ab5fSopenharmony_ci } 19903af6ab5fSopenharmony_ci let e = Direction.Up >> 1 // -1 19913af6ab5fSopenharmony_ci let f = Direction.Up >>> 1 // 2147483647 19923af6ab5fSopenharmony_ci 19933af6ab5fSopenharmony_ci let g = ("10" as any) << 1 // 20 19943af6ab5fSopenharmony_ci let h = ("str" as any) << 1 // 0 19953af6ab5fSopenharmony_ci 19963af6ab5fSopenharmony_ci let i = 10 * 5 19973af6ab5fSopenharmony_ci let j = 10 / 5 19983af6ab5fSopenharmony_ci let k = 10 % 5 19993af6ab5fSopenharmony_ci let l = 10 - 5 20003af6ab5fSopenharmony_ci 20013af6ab5fSopenharmony_ci|CB_OK| 20023af6ab5fSopenharmony_ci~~~~~~~ 20033af6ab5fSopenharmony_ci 20043af6ab5fSopenharmony_ci.. code-block:: typescript 20053af6ab5fSopenharmony_ci 20063af6ab5fSopenharmony_ci let a = (5 & 5) // 5 20073af6ab5fSopenharmony_ci let b = (5.5 & 5.5) // Compile-time error 20083af6ab5fSopenharmony_ci let c = (5 | 5) // 5 20093af6ab5fSopenharmony_ci let d = (5.5 | 5.5) // Compile-time error 20103af6ab5fSopenharmony_ci 20113af6ab5fSopenharmony_ci enum Direction { 20123af6ab5fSopenharmony_ci Up, // TBD: explicit start value 20133af6ab5fSopenharmony_ci Down 20143af6ab5fSopenharmony_ci } 20153af6ab5fSopenharmony_ci 20163af6ab5fSopenharmony_ci let e = Direction.Up >> 1 // 0 20173af6ab5fSopenharmony_ci let f = Direction.Up >>> 1 // 0 20183af6ab5fSopenharmony_ci 20193af6ab5fSopenharmony_ci let i = 10 * 5 20203af6ab5fSopenharmony_ci let j = 10 / 5 20213af6ab5fSopenharmony_ci let k = 10 % 5 20223af6ab5fSopenharmony_ci let l = 10 - 5 20233af6ab5fSopenharmony_ci 20243af6ab5fSopenharmony_ci|CB_SEE| 20253af6ab5fSopenharmony_ci~~~~~~~~ 20263af6ab5fSopenharmony_ci 20273af6ab5fSopenharmony_ci* :ref:`R055` 20283af6ab5fSopenharmony_ci* :ref:`R056` 20293af6ab5fSopenharmony_ci* :ref:`R057` 20303af6ab5fSopenharmony_ci* :ref:`R062` 20313af6ab5fSopenharmony_ci* :ref:`R063` 20323af6ab5fSopenharmony_ci* :ref:`R064` 20333af6ab5fSopenharmony_ci* :ref:`R067` 20343af6ab5fSopenharmony_ci* :ref:`R068` 20353af6ab5fSopenharmony_ci* :ref:`R078` 20363af6ab5fSopenharmony_ci 20373af6ab5fSopenharmony_ci.. _R062: 20383af6ab5fSopenharmony_ci 20393af6ab5fSopenharmony_ci|CB_R| #62: Binary operators ``<<``, ``>>``, ``>>>``, ``&``, ``^`` and ``|`` work only on integral numeric types 20403af6ab5fSopenharmony_ci---------------------------------------------------------------------------------------------------------------- 20413af6ab5fSopenharmony_ci 20423af6ab5fSopenharmony_ci|CB_RULE| 20433af6ab5fSopenharmony_ci~~~~~~~~~ 20443af6ab5fSopenharmony_ci 20453af6ab5fSopenharmony_ci|LANG| expects an explicit cast to an integral type for logical binary 20463af6ab5fSopenharmony_cioperations. Implicit casts are prohibited and cause compile-time errors. 20473af6ab5fSopenharmony_ci 20483af6ab5fSopenharmony_ci|CB_BAD| 20493af6ab5fSopenharmony_ci~~~~~~~~ 20503af6ab5fSopenharmony_ci 20513af6ab5fSopenharmony_ci.. code-block:: typescript 20523af6ab5fSopenharmony_ci 20533af6ab5fSopenharmony_ci let b = (5.5 & 5.5) // 5, not 5.5 20543af6ab5fSopenharmony_ci let d = (5.5 | 5.5) // 5, not 5.5 20553af6ab5fSopenharmony_ci 20563af6ab5fSopenharmony_ci let g = ("10" as any) << 1 // 20 20573af6ab5fSopenharmony_ci let h = ("str" as any) << 1 // 0 20583af6ab5fSopenharmony_ci 20593af6ab5fSopenharmony_ci|CB_OK| 20603af6ab5fSopenharmony_ci~~~~~~~ 20613af6ab5fSopenharmony_ci 20623af6ab5fSopenharmony_ci.. code-block:: typescript 20633af6ab5fSopenharmony_ci 20643af6ab5fSopenharmony_ci let b = (5.5 & 5.5) // Compile-time error 20653af6ab5fSopenharmony_ci let d = (5.5 | 5.5) // Compile-time error 20663af6ab5fSopenharmony_ci 20673af6ab5fSopenharmony_ci|CB_SEE| 20683af6ab5fSopenharmony_ci~~~~~~~~ 20693af6ab5fSopenharmony_ci 20703af6ab5fSopenharmony_ci* :ref:`R055` 20713af6ab5fSopenharmony_ci* :ref:`R056` 20723af6ab5fSopenharmony_ci* :ref:`R057` 20733af6ab5fSopenharmony_ci* :ref:`R061` 20743af6ab5fSopenharmony_ci* :ref:`R063` 20753af6ab5fSopenharmony_ci* :ref:`R064` 20763af6ab5fSopenharmony_ci* :ref:`R067` 20773af6ab5fSopenharmony_ci* :ref:`R068` 20783af6ab5fSopenharmony_ci* :ref:`R078` 20793af6ab5fSopenharmony_ci 20803af6ab5fSopenharmony_ci.. _R063: 20813af6ab5fSopenharmony_ci 20823af6ab5fSopenharmony_ci|CB_R| #63: Binary ``+`` operator supports implicit casts only for numbers and strings 20833af6ab5fSopenharmony_ci-------------------------------------------------------------------------------------- 20843af6ab5fSopenharmony_ci 20853af6ab5fSopenharmony_ci|CB_RULE| 20863af6ab5fSopenharmony_ci~~~~~~~~~ 20873af6ab5fSopenharmony_ci 20883af6ab5fSopenharmony_ci|LANG| supports implicit casts for ``+`` only for strings and numbers. 20893af6ab5fSopenharmony_ciElsewhere, any form of an explicit cast to string is required. 20903af6ab5fSopenharmony_ci 20913af6ab5fSopenharmony_ci|CB_BAD| 20923af6ab5fSopenharmony_ci~~~~~~~~ 20933af6ab5fSopenharmony_ci 20943af6ab5fSopenharmony_ci.. code-block:: typescript 20953af6ab5fSopenharmony_ci 20963af6ab5fSopenharmony_ci enum E { E1, E2 } 20973af6ab5fSopenharmony_ci 20983af6ab5fSopenharmony_ci let a = 10 + 32 // 42 20993af6ab5fSopenharmony_ci let b = E.E1 + 10 // 10 21003af6ab5fSopenharmony_ci let c = 10 + "5" // "105" 21013af6ab5fSopenharmony_ci 21023af6ab5fSopenharmony_ci let d = "5" + E.E2 // "51" 21033af6ab5fSopenharmony_ci let e = "Hello, " + "world!" // "Hello, world!" 21043af6ab5fSopenharmony_ci let f = "string" + true // "stringtrue" 21053af6ab5fSopenharmony_ci 21063af6ab5fSopenharmony_ci let g = (new Object()) + "string" // "[object Object]string" 21073af6ab5fSopenharmony_ci 21083af6ab5fSopenharmony_ci|CB_OK| 21093af6ab5fSopenharmony_ci~~~~~~~ 21103af6ab5fSopenharmony_ci 21113af6ab5fSopenharmony_ci.. code-block:: typescript 21123af6ab5fSopenharmony_ci 21133af6ab5fSopenharmony_ci enum E { E1, E2 } 21143af6ab5fSopenharmony_ci 21153af6ab5fSopenharmony_ci let a = 10 + 32 // 42 21163af6ab5fSopenharmony_ci let b = E.E1 + 10 // 10 21173af6ab5fSopenharmony_ci let c = 10 + "5" // "105" 21183af6ab5fSopenharmony_ci 21193af6ab5fSopenharmony_ci let d = "5" + E.E2 // "51" 21203af6ab5fSopenharmony_ci let e = "Hello, " + "world!" // "Hello, world!" 21213af6ab5fSopenharmony_ci let f = "string" + true // "stringtrue" 21223af6ab5fSopenharmony_ci 21233af6ab5fSopenharmony_ci let g = (new Object()).toString() + "string" 21243af6ab5fSopenharmony_ci 21253af6ab5fSopenharmony_ci|CB_SEE| 21263af6ab5fSopenharmony_ci~~~~~~~~ 21273af6ab5fSopenharmony_ci 21283af6ab5fSopenharmony_ci* :ref:`R055` 21293af6ab5fSopenharmony_ci* :ref:`R056` 21303af6ab5fSopenharmony_ci* :ref:`R057` 21313af6ab5fSopenharmony_ci* :ref:`R061` 21323af6ab5fSopenharmony_ci* :ref:`R062` 21333af6ab5fSopenharmony_ci* :ref:`R064` 21343af6ab5fSopenharmony_ci* :ref:`R067` 21353af6ab5fSopenharmony_ci* :ref:`R068` 21363af6ab5fSopenharmony_ci* :ref:`R078` 21373af6ab5fSopenharmony_ci 21383af6ab5fSopenharmony_ci.. _R064: 21393af6ab5fSopenharmony_ci 21403af6ab5fSopenharmony_ci|CB_R| #64: Binary ``+`` operator requires explicit casts for non-numbers and non-strings 21413af6ab5fSopenharmony_ci----------------------------------------------------------------------------------------- 21423af6ab5fSopenharmony_ci 21433af6ab5fSopenharmony_ci|CB_RULE| 21443af6ab5fSopenharmony_ci~~~~~~~~~ 21453af6ab5fSopenharmony_ci 21463af6ab5fSopenharmony_ci|LANG| supports implicit casts for ``+`` only for strings and numbers. 21473af6ab5fSopenharmony_ciElsewhere, any form of an explicit cast to string is required. 21483af6ab5fSopenharmony_ci 21493af6ab5fSopenharmony_ci|CB_BAD| 21503af6ab5fSopenharmony_ci~~~~~~~~ 21513af6ab5fSopenharmony_ci 21523af6ab5fSopenharmony_ci.. code-block:: typescript 21533af6ab5fSopenharmony_ci 21543af6ab5fSopenharmony_ci // "[object Object][object Object]" 21553af6ab5fSopenharmony_ci let o = ({x: 5} as any) + {y: 6} 21563af6ab5fSopenharmony_ci 21573af6ab5fSopenharmony_ci|CB_OK| 21583af6ab5fSopenharmony_ci~~~~~~~ 21593af6ab5fSopenharmony_ci 21603af6ab5fSopenharmony_ci.. code-block:: typescript 21613af6ab5fSopenharmony_ci 21623af6ab5fSopenharmony_ci let o = (new Object()).toString() + new Int(5) // "5" 21633af6ab5fSopenharmony_ci 21643af6ab5fSopenharmony_ci|CB_SEE| 21653af6ab5fSopenharmony_ci~~~~~~~~ 21663af6ab5fSopenharmony_ci 21673af6ab5fSopenharmony_ci* :ref:`R055` 21683af6ab5fSopenharmony_ci* :ref:`R056` 21693af6ab5fSopenharmony_ci* :ref:`R057` 21703af6ab5fSopenharmony_ci* :ref:`R061` 21713af6ab5fSopenharmony_ci* :ref:`R062` 21723af6ab5fSopenharmony_ci* :ref:`R063` 21733af6ab5fSopenharmony_ci* :ref:`R067` 21743af6ab5fSopenharmony_ci* :ref:`R068` 21753af6ab5fSopenharmony_ci* :ref:`R078` 21763af6ab5fSopenharmony_ci 21773af6ab5fSopenharmony_ci|CB_R| #65: ``instanceof`` operator is partially supported 21783af6ab5fSopenharmony_ci---------------------------------------------------------- 21793af6ab5fSopenharmony_ci 21803af6ab5fSopenharmony_ci|CB_RULE| 21813af6ab5fSopenharmony_ci~~~~~~~~~ 21823af6ab5fSopenharmony_ci 21833af6ab5fSopenharmony_ciIn |TS|, the left-hand side of an ``instanceof`` expression must be of type 21843af6ab5fSopenharmony_ci``any``, an object type or a type parameter, otherwise the result is ``false``. 21853af6ab5fSopenharmony_ciIn |LANG|, the left-hand side expression may be of any reference type, otherwise 21863af6ab5fSopenharmony_cia compile-time error occurs. In addition, the left operand in |LANG| cannot be 21873af6ab5fSopenharmony_cia type. 21883af6ab5fSopenharmony_ci 21893af6ab5fSopenharmony_ci|CB_BAD| 21903af6ab5fSopenharmony_ci~~~~~~~~ 21913af6ab5fSopenharmony_ci 21923af6ab5fSopenharmony_ci.. code-block:: typescript 21933af6ab5fSopenharmony_ci 21943af6ab5fSopenharmony_ci class X {} 21953af6ab5fSopenharmony_ci 21963af6ab5fSopenharmony_ci let a = (new X()) instanceof Object // true 21973af6ab5fSopenharmony_ci let b = (new X()) instanceof X // true 21983af6ab5fSopenharmony_ci // left operand is a type: 21993af6ab5fSopenharmony_ci let c = X instanceof Object // true 22003af6ab5fSopenharmony_ci let d = X instanceof X // false 22013af6ab5fSopenharmony_ci 22023af6ab5fSopenharmony_ci // left operand is not of type any 22033af6ab5fSopenharmony_ci let e = (5.0 as Number) instanceof Number // false 22043af6ab5fSopenharmony_ci 22053af6ab5fSopenharmony_ci|CB_OK| 22063af6ab5fSopenharmony_ci~~~~~~~ 22073af6ab5fSopenharmony_ci 22083af6ab5fSopenharmony_ci.. code-block:: typescript 22093af6ab5fSopenharmony_ci 22103af6ab5fSopenharmony_ci class X {} 22113af6ab5fSopenharmony_ci 22123af6ab5fSopenharmony_ci let a = (new X()) instanceof Object // true 22133af6ab5fSopenharmony_ci let b = (new X()) instanceof X // true 22143af6ab5fSopenharmony_ci // left operand is a type: 22153af6ab5fSopenharmony_ci let c = X instanceof Object // Compile-time error 22163af6ab5fSopenharmony_ci let d = X instanceof X // Compile-time error 22173af6ab5fSopenharmony_ci 22183af6ab5fSopenharmony_ci // left operand may be of any reference type, like number 22193af6ab5fSopenharmony_ci let e = (5.0 as Number) instanceof Number // true 22203af6ab5fSopenharmony_ci 22213af6ab5fSopenharmony_ci.. _R066: 22223af6ab5fSopenharmony_ci 22233af6ab5fSopenharmony_ci|CB_R| #66: ``in`` operator is not supported 22243af6ab5fSopenharmony_ci-------------------------------------------- 22253af6ab5fSopenharmony_ci 22263af6ab5fSopenharmony_ci|CB_RULE| 22273af6ab5fSopenharmony_ci~~~~~~~~~ 22283af6ab5fSopenharmony_ci 22293af6ab5fSopenharmony_ci|LANG| does not support the ``in`` operator. However, this operator makes 22303af6ab5fSopenharmony_cilittle sense since the object layout is known at compile time and cannot 22313af6ab5fSopenharmony_cibe modified at runtime. Use ``instanceof`` as a work-around if you still need 22323af6ab5fSopenharmony_cito check whether certain class members exist. 22333af6ab5fSopenharmony_ci 22343af6ab5fSopenharmony_ci|CB_BAD| 22353af6ab5fSopenharmony_ci~~~~~~~~ 22363af6ab5fSopenharmony_ci 22373af6ab5fSopenharmony_ci.. code-block:: typescript 22383af6ab5fSopenharmony_ci 22393af6ab5fSopenharmony_ci class Person { 22403af6ab5fSopenharmony_ci name: string = "" 22413af6ab5fSopenharmony_ci } 22423af6ab5fSopenharmony_ci let p = new Person() 22433af6ab5fSopenharmony_ci 22443af6ab5fSopenharmony_ci let b = "name" in p // true 22453af6ab5fSopenharmony_ci 22463af6ab5fSopenharmony_ci|CB_OK| 22473af6ab5fSopenharmony_ci~~~~~~~ 22483af6ab5fSopenharmony_ci 22493af6ab5fSopenharmony_ci.. code-block:: typescript 22503af6ab5fSopenharmony_ci 22513af6ab5fSopenharmony_ci class Person { 22523af6ab5fSopenharmony_ci name: string = "" 22533af6ab5fSopenharmony_ci } 22543af6ab5fSopenharmony_ci let p = new Person() 22553af6ab5fSopenharmony_ci 22563af6ab5fSopenharmony_ci let b = p instanceof Person // true, and "name" is guaranteed to be present 22573af6ab5fSopenharmony_ci 22583af6ab5fSopenharmony_ci|CB_SEE| 22593af6ab5fSopenharmony_ci~~~~~~~~ 22603af6ab5fSopenharmony_ci 22613af6ab5fSopenharmony_ci* :ref:`R001` 22623af6ab5fSopenharmony_ci* :ref:`R002` 22633af6ab5fSopenharmony_ci* :ref:`R052` 22643af6ab5fSopenharmony_ci* :ref:`R059` 22653af6ab5fSopenharmony_ci* :ref:`R060` 22663af6ab5fSopenharmony_ci* :ref:`R105` 22673af6ab5fSopenharmony_ci* :ref:`R109` 22683af6ab5fSopenharmony_ci 22693af6ab5fSopenharmony_ci.. _R067: 22703af6ab5fSopenharmony_ci 22713af6ab5fSopenharmony_ci|CB_R| #67: Operators ``&&`` and ``||`` work on values of the boolean type only 22723af6ab5fSopenharmony_ci------------------------------------------------------------------------------- 22733af6ab5fSopenharmony_ci 22743af6ab5fSopenharmony_ci|CB_RULE| 22753af6ab5fSopenharmony_ci~~~~~~~~~ 22763af6ab5fSopenharmony_ci 22773af6ab5fSopenharmony_ci|LANG| supports using ``&&`` and ``||`` operators only for the values of the 22783af6ab5fSopenharmony_ciboolean type. Explicit cast from some type to the boolean (or Boolean) is 22793af6ab5fSopenharmony_cimandatory. Implicit casts are prohibited and cause compile-time errors. 22803af6ab5fSopenharmony_ci 22813af6ab5fSopenharmony_ci|CB_BAD| 22823af6ab5fSopenharmony_ci~~~~~~~~ 22833af6ab5fSopenharmony_ci 22843af6ab5fSopenharmony_ci.. code-block:: typescript 22853af6ab5fSopenharmony_ci 22863af6ab5fSopenharmony_ci let a = true && false // false 22873af6ab5fSopenharmony_ci let b = 5 || 0 // 5 22883af6ab5fSopenharmony_ci let c = 5 && 0 // 0 22893af6ab5fSopenharmony_ci let d = "" && 5 // "" 22903af6ab5fSopenharmony_ci let e = "" || "abcd" // "abcd" 22913af6ab5fSopenharmony_ci 22923af6ab5fSopenharmony_ci|CB_OK| 22933af6ab5fSopenharmony_ci~~~~~~~ 22943af6ab5fSopenharmony_ci 22953af6ab5fSopenharmony_ci.. code-block:: typescript 22963af6ab5fSopenharmony_ci 22973af6ab5fSopenharmony_ci let a = true && false // false 22983af6ab5fSopenharmony_ci let b = 5 || 0 // Compile-time error 22993af6ab5fSopenharmony_ci let c = 5 && 0 // Compile-time error 23003af6ab5fSopenharmony_ci let d = "" && 5 // Compile-time error 23013af6ab5fSopenharmony_ci let e = "" || "abcd" // Compile-time error 23023af6ab5fSopenharmony_ci 23033af6ab5fSopenharmony_ci|CB_SEE| 23043af6ab5fSopenharmony_ci~~~~~~~~ 23053af6ab5fSopenharmony_ci 23063af6ab5fSopenharmony_ci* :ref:`R055` 23073af6ab5fSopenharmony_ci* :ref:`R056` 23083af6ab5fSopenharmony_ci* :ref:`R057` 23093af6ab5fSopenharmony_ci* :ref:`R061` 23103af6ab5fSopenharmony_ci* :ref:`R062` 23113af6ab5fSopenharmony_ci* :ref:`R063` 23123af6ab5fSopenharmony_ci* :ref:`R064` 23133af6ab5fSopenharmony_ci* :ref:`R068` 23143af6ab5fSopenharmony_ci* :ref:`R078` 23153af6ab5fSopenharmony_ci 23163af6ab5fSopenharmony_ci.. _R068: 23173af6ab5fSopenharmony_ci 23183af6ab5fSopenharmony_ci|CB_R| #68: Using of ``&&`` and ``||`` on non-boolean types is not supported 23193af6ab5fSopenharmony_ci---------------------------------------------------------------------------- 23203af6ab5fSopenharmony_ci 23213af6ab5fSopenharmony_ci|CB_RULE| 23223af6ab5fSopenharmony_ci~~~~~~~~~ 23233af6ab5fSopenharmony_ci 23243af6ab5fSopenharmony_ci|LANG| supports the usage of ``&&`` and ``||`` operators only for the values 23253af6ab5fSopenharmony_ciof the boolean type. Explicit cast from some type to the boolean (or Boolean) 23263af6ab5fSopenharmony_ciis mandatory. Implicit casts are prohibited and cause compile-time errors. 23273af6ab5fSopenharmony_ci 23283af6ab5fSopenharmony_ci|CB_BAD| 23293af6ab5fSopenharmony_ci~~~~~~~~ 23303af6ab5fSopenharmony_ci 23313af6ab5fSopenharmony_ci.. code-block:: typescript 23323af6ab5fSopenharmony_ci 23333af6ab5fSopenharmony_ci let a = true && false // false 23343af6ab5fSopenharmony_ci let b = 5 || 0 // 5 23353af6ab5fSopenharmony_ci let c = 5 && 0 // 0 23363af6ab5fSopenharmony_ci let d = "" && 5 // "" 23373af6ab5fSopenharmony_ci let e = "" || "abcd" // "abcd" 23383af6ab5fSopenharmony_ci 23393af6ab5fSopenharmony_ci|CB_OK| 23403af6ab5fSopenharmony_ci~~~~~~~ 23413af6ab5fSopenharmony_ci 23423af6ab5fSopenharmony_ci.. code-block:: typescript 23433af6ab5fSopenharmony_ci 23443af6ab5fSopenharmony_ci let a = true && false // false 23453af6ab5fSopenharmony_ci let b = 5 || 0 // Compile-time error 23463af6ab5fSopenharmony_ci let c = 5 && 0 // Compile-time error 23473af6ab5fSopenharmony_ci let d = "" && 5 // Compile-time error 23483af6ab5fSopenharmony_ci let e = "" || "abcd" // Compile-time error 23493af6ab5fSopenharmony_ci 23503af6ab5fSopenharmony_ci|CB_SEE| 23513af6ab5fSopenharmony_ci~~~~~~~~ 23523af6ab5fSopenharmony_ci 23533af6ab5fSopenharmony_ci* :ref:`R055` 23543af6ab5fSopenharmony_ci* :ref:`R056` 23553af6ab5fSopenharmony_ci* :ref:`R057` 23563af6ab5fSopenharmony_ci* :ref:`R061` 23573af6ab5fSopenharmony_ci* :ref:`R062` 23583af6ab5fSopenharmony_ci* :ref:`R063` 23593af6ab5fSopenharmony_ci* :ref:`R064` 23603af6ab5fSopenharmony_ci* :ref:`R067` 23613af6ab5fSopenharmony_ci* :ref:`R078` 23623af6ab5fSopenharmony_ci 23633af6ab5fSopenharmony_ci.. _R069: 23643af6ab5fSopenharmony_ci 23653af6ab5fSopenharmony_ci|CB_R| #69: Destructuring assignment is not supported 23663af6ab5fSopenharmony_ci----------------------------------------------------- 23673af6ab5fSopenharmony_ci 23683af6ab5fSopenharmony_ci|CB_RULE| 23693af6ab5fSopenharmony_ci~~~~~~~~~ 23703af6ab5fSopenharmony_ci 23713af6ab5fSopenharmony_ci|LANG| does not support destructuring assignment. Other idioms (e.g., 23723af6ab5fSopenharmony_ciusing a temporary variable, where applicable) can be used for replacement. 23733af6ab5fSopenharmony_ci 23743af6ab5fSopenharmony_ci|CB_BAD| 23753af6ab5fSopenharmony_ci~~~~~~~~ 23763af6ab5fSopenharmony_ci 23773af6ab5fSopenharmony_ci.. code-block:: typescript 23783af6ab5fSopenharmony_ci 23793af6ab5fSopenharmony_ci let [one, two] = [1, 2] 23803af6ab5fSopenharmony_ci [one, two] = [two, one] 23813af6ab5fSopenharmony_ci 23823af6ab5fSopenharmony_ci let head, tail 23833af6ab5fSopenharmony_ci [head, ...tail] = [1, 2, 3, 4] 23843af6ab5fSopenharmony_ci 23853af6ab5fSopenharmony_ci|CB_OK| 23863af6ab5fSopenharmony_ci~~~~~~~ 23873af6ab5fSopenharmony_ci 23883af6ab5fSopenharmony_ci.. code-block:: typescript 23893af6ab5fSopenharmony_ci 23903af6ab5fSopenharmony_ci let arr: number[] = [1, 2] 23913af6ab5fSopenharmony_ci let one = arr[0] 23923af6ab5fSopenharmony_ci let two = arr[1] 23933af6ab5fSopenharmony_ci 23943af6ab5fSopenharmony_ci let tmp = one 23953af6ab5fSopenharmony_ci one = two 23963af6ab5fSopenharmony_ci two = tmp 23973af6ab5fSopenharmony_ci 23983af6ab5fSopenharmony_ci let data: Number[] = [1,2,3,4] 23993af6ab5fSopenharmony_ci let head = data[0] 24003af6ab5fSopenharmony_ci let tail = new Number[data.length - 1] 24013af6ab5fSopenharmony_ci for (let i = 1; i < data.length; ++i) { 24023af6ab5fSopenharmony_ci tail[i-1] = data[i] 24033af6ab5fSopenharmony_ci } 24043af6ab5fSopenharmony_ci 24053af6ab5fSopenharmony_ci.. _R071: 24063af6ab5fSopenharmony_ci 24073af6ab5fSopenharmony_ci|CB_R| #71: The comma operator ``,`` is supported only in ``for`` loops 24083af6ab5fSopenharmony_ci----------------------------------------------------------------------- 24093af6ab5fSopenharmony_ci 24103af6ab5fSopenharmony_ci|CB_RULE| 24113af6ab5fSopenharmony_ci~~~~~~~~~ 24123af6ab5fSopenharmony_ci 24133af6ab5fSopenharmony_ci|LANG| supports the comma operator ``,`` only in ``for`` loops. Otherwise, 24143af6ab5fSopenharmony_ciit is useless as it makes the execution order harder to understand. 24153af6ab5fSopenharmony_ci 24163af6ab5fSopenharmony_ci|CB_BAD| 24173af6ab5fSopenharmony_ci~~~~~~~~ 24183af6ab5fSopenharmony_ci 24193af6ab5fSopenharmony_ci.. code-block:: typescript 24203af6ab5fSopenharmony_ci 24213af6ab5fSopenharmony_ci for (let i = 0, j = 0; i < 10; ++i, j += 2) { 24223af6ab5fSopenharmony_ci console.log(i, j) 24233af6ab5fSopenharmony_ci } 24243af6ab5fSopenharmony_ci 24253af6ab5fSopenharmony_ci let x = 0 24263af6ab5fSopenharmony_ci x = (++x, x++) // 1 24273af6ab5fSopenharmony_ci 24283af6ab5fSopenharmony_ci|CB_OK| 24293af6ab5fSopenharmony_ci~~~~~~~ 24303af6ab5fSopenharmony_ci 24313af6ab5fSopenharmony_ci.. code-block:: typescript 24323af6ab5fSopenharmony_ci 24333af6ab5fSopenharmony_ci for (let i = 0, j = 0; i < 10; ++i, j += 2) { 24343af6ab5fSopenharmony_ci console.log(i, j) 24353af6ab5fSopenharmony_ci } 24363af6ab5fSopenharmony_ci 24373af6ab5fSopenharmony_ci // Use explicit execution order instead of the comma operator: 24383af6ab5fSopenharmony_ci let x = 0 24393af6ab5fSopenharmony_ci ++x 24403af6ab5fSopenharmony_ci x = x++ 24413af6ab5fSopenharmony_ci 24423af6ab5fSopenharmony_ci.. _R073: 24433af6ab5fSopenharmony_ci 24443af6ab5fSopenharmony_ci|CB_R| #74: Destructuring variable declarations are not supported 24453af6ab5fSopenharmony_ci----------------------------------------------------------------- 24463af6ab5fSopenharmony_ci 24473af6ab5fSopenharmony_ci|CB_RULE| 24483af6ab5fSopenharmony_ci~~~~~~~~~ 24493af6ab5fSopenharmony_ci 24503af6ab5fSopenharmony_ci|LANG| does not support destructuring variable declarations. This is a dynamic 24513af6ab5fSopenharmony_cifeature relying on structural compatibility. In addition, names in destructuring 24523af6ab5fSopenharmony_cideclarations must be equal to properties within destructured classes. 24533af6ab5fSopenharmony_ci 24543af6ab5fSopenharmony_ci|CB_BAD| 24553af6ab5fSopenharmony_ci~~~~~~~~ 24563af6ab5fSopenharmony_ci 24573af6ab5fSopenharmony_ci.. code:: typescript 24583af6ab5fSopenharmony_ci 24593af6ab5fSopenharmony_ci class Point { 24603af6ab5fSopenharmony_ci x: number = 0.0 24613af6ab5fSopenharmony_ci y: number = 0.0 24623af6ab5fSopenharmony_ci } 24633af6ab5fSopenharmony_ci 24643af6ab5fSopenharmony_ci function returnZeroPoint(): Point { 24653af6ab5fSopenharmony_ci return new Point() 24663af6ab5fSopenharmony_ci } 24673af6ab5fSopenharmony_ci 24683af6ab5fSopenharmony_ci let {x, y} = returnZeroPoint() 24693af6ab5fSopenharmony_ci 24703af6ab5fSopenharmony_ci|CB_OK| 24713af6ab5fSopenharmony_ci~~~~~~~ 24723af6ab5fSopenharmony_ci 24733af6ab5fSopenharmony_ci.. code:: typescript 24743af6ab5fSopenharmony_ci 24753af6ab5fSopenharmony_ci class Point { 24763af6ab5fSopenharmony_ci x: number = 0.0 24773af6ab5fSopenharmony_ci y: number = 0.0 24783af6ab5fSopenharmony_ci } 24793af6ab5fSopenharmony_ci 24803af6ab5fSopenharmony_ci function returnZeroPoint(): Point { 24813af6ab5fSopenharmony_ci return new Point() 24823af6ab5fSopenharmony_ci } 24833af6ab5fSopenharmony_ci 24843af6ab5fSopenharmony_ci // Create an intermediate object and work with it field by field 24853af6ab5fSopenharmony_ci // without name restrictions: 24863af6ab5fSopenharmony_ci let zp = returnZeroPoint() 24873af6ab5fSopenharmony_ci let x = zp.x 24883af6ab5fSopenharmony_ci let y = zp.y 24893af6ab5fSopenharmony_ci 24903af6ab5fSopenharmony_ci.. _R076: 24913af6ab5fSopenharmony_ci 24923af6ab5fSopenharmony_ci|CB_R| #76: Inference of implied types is not supported 24933af6ab5fSopenharmony_ci------------------------------------------------------- 24943af6ab5fSopenharmony_ci 24953af6ab5fSopenharmony_ci|CB_RULE| 24963af6ab5fSopenharmony_ci~~~~~~~~~ 24973af6ab5fSopenharmony_ci 24983af6ab5fSopenharmony_ciCurrently, |LANG| does not support inference of implied types. Use explicit 24993af6ab5fSopenharmony_citype notation instead. Use ``Object[]`` if you need containers that hold 25003af6ab5fSopenharmony_cidata of mixed types. 25013af6ab5fSopenharmony_ci 25023af6ab5fSopenharmony_ci|CB_BAD| 25033af6ab5fSopenharmony_ci~~~~~~~~ 25043af6ab5fSopenharmony_ci 25053af6ab5fSopenharmony_ci.. code-block:: typescript 25063af6ab5fSopenharmony_ci 25073af6ab5fSopenharmony_ci let [a, b, c] = [1, "hello", true] 25083af6ab5fSopenharmony_ci 25093af6ab5fSopenharmony_ci|CB_OK| 25103af6ab5fSopenharmony_ci~~~~~~~ 25113af6ab5fSopenharmony_ci 25123af6ab5fSopenharmony_ci.. code-block:: typescript 25133af6ab5fSopenharmony_ci 25143af6ab5fSopenharmony_ci let a = 1 25153af6ab5fSopenharmony_ci let b = "hello" 25163af6ab5fSopenharmony_ci let c = true 25173af6ab5fSopenharmony_ci 25183af6ab5fSopenharmony_ci let arr: Object[] = [1, "hello", true] 25193af6ab5fSopenharmony_ci let a1 = arr[0] 25203af6ab5fSopenharmony_ci let b1 = arr[1] 25213af6ab5fSopenharmony_ci let c1 = arr[2] 25223af6ab5fSopenharmony_ci 25233af6ab5fSopenharmony_ci.. _R078: 25243af6ab5fSopenharmony_ci 25253af6ab5fSopenharmony_ci|CB_R| #78: Implicit casts to the boolean are not supported in ``if``, ``do`` and ``while`` 25263af6ab5fSopenharmony_ci------------------------------------------------------------------------------------------- 25273af6ab5fSopenharmony_ci 25283af6ab5fSopenharmony_ci|CB_RULE| 25293af6ab5fSopenharmony_ci~~~~~~~~~ 25303af6ab5fSopenharmony_ci 25313af6ab5fSopenharmony_ci|LANG| supports only values of the boolean type in ``if``, ``do`` and ``while`` 25323af6ab5fSopenharmony_cistatements. Implicit casts from other types to the boolean are prohibited and 25333af6ab5fSopenharmony_cicause compile-time errors. 25343af6ab5fSopenharmony_ci 25353af6ab5fSopenharmony_ci|CB_BAD| 25363af6ab5fSopenharmony_ci~~~~~~~~ 25373af6ab5fSopenharmony_ci 25383af6ab5fSopenharmony_ci.. code-block:: typescript 25393af6ab5fSopenharmony_ci 25403af6ab5fSopenharmony_ci if (true) {} 25413af6ab5fSopenharmony_ci do {} while (false) 25423af6ab5fSopenharmony_ci 25433af6ab5fSopenharmony_ci let a = new Boolean(true) 25443af6ab5fSopenharmony_ci if (a) {} 25453af6ab5fSopenharmony_ci do {break} while (a) 25463af6ab5fSopenharmony_ci while (a) {break} 25473af6ab5fSopenharmony_ci 25483af6ab5fSopenharmony_ci let b = 42 25493af6ab5fSopenharmony_ci if (b) {} 25503af6ab5fSopenharmony_ci do {break} while (b) 25513af6ab5fSopenharmony_ci while (b) {break} 25523af6ab5fSopenharmony_ci 25533af6ab5fSopenharmony_ci let c = "str" 25543af6ab5fSopenharmony_ci if (c) {} 25553af6ab5fSopenharmony_ci do {break} while (c) 25563af6ab5fSopenharmony_ci while (c) {break} 25573af6ab5fSopenharmony_ci 25583af6ab5fSopenharmony_ci let d = new Object() 25593af6ab5fSopenharmony_ci if (d) {} 25603af6ab5fSopenharmony_ci do {break} while (d) 25613af6ab5fSopenharmony_ci while (d) {break} 25623af6ab5fSopenharmony_ci 25633af6ab5fSopenharmony_ci|CB_OK| 25643af6ab5fSopenharmony_ci~~~~~~~ 25653af6ab5fSopenharmony_ci 25663af6ab5fSopenharmony_ci.. code-block:: typescript 25673af6ab5fSopenharmony_ci 25683af6ab5fSopenharmony_ci if (true) {} 25693af6ab5fSopenharmony_ci do {} while (false) 25703af6ab5fSopenharmony_ci 25713af6ab5fSopenharmony_ci let a = new Boolean(true) 25723af6ab5fSopenharmony_ci if (a) {} 25733af6ab5fSopenharmony_ci do {break} while (a) 25743af6ab5fSopenharmony_ci while (a) {break} 25753af6ab5fSopenharmony_ci 25763af6ab5fSopenharmony_ci let b = 42 25773af6ab5fSopenharmony_ci if (b != 0) {} 25783af6ab5fSopenharmony_ci do {break} while (b != 0) 25793af6ab5fSopenharmony_ci while (b != 0) {break} 25803af6ab5fSopenharmony_ci 25813af6ab5fSopenharmony_ci let c = "str" 25823af6ab5fSopenharmony_ci if (c.length != 0) {} 25833af6ab5fSopenharmony_ci do {break} while (c.length != 0) 25843af6ab5fSopenharmony_ci while (c.length != 0) {break} 25853af6ab5fSopenharmony_ci 25863af6ab5fSopenharmony_ci let d = new Object() 25873af6ab5fSopenharmony_ci if (d != null) {} 25883af6ab5fSopenharmony_ci do {break} while (d != null) 25893af6ab5fSopenharmony_ci while (d != null) {break} 25903af6ab5fSopenharmony_ci 25913af6ab5fSopenharmony_ci|CB_SEE| 25923af6ab5fSopenharmony_ci~~~~~~~~ 25933af6ab5fSopenharmony_ci 25943af6ab5fSopenharmony_ci* :ref:`R055` 25953af6ab5fSopenharmony_ci* :ref:`R056` 25963af6ab5fSopenharmony_ci* :ref:`R057` 25973af6ab5fSopenharmony_ci* :ref:`R061` 25983af6ab5fSopenharmony_ci* :ref:`R062` 25993af6ab5fSopenharmony_ci* :ref:`R063` 26003af6ab5fSopenharmony_ci* :ref:`R064` 26013af6ab5fSopenharmony_ci* :ref:`R067` 26023af6ab5fSopenharmony_ci* :ref:`R068` 26033af6ab5fSopenharmony_ci 26043af6ab5fSopenharmony_ci.. _R079: 26053af6ab5fSopenharmony_ci 26063af6ab5fSopenharmony_ci|CB_R| #79: Type annotation in catch clause is not supported 26073af6ab5fSopenharmony_ci------------------------------------------------------------ 26083af6ab5fSopenharmony_ci 26093af6ab5fSopenharmony_ci|CB_RULE| 26103af6ab5fSopenharmony_ci~~~~~~~~~ 26113af6ab5fSopenharmony_ci 26123af6ab5fSopenharmony_ciIn |TS| catch clause variable type annotation must be ``any`` or ``unknown`` if specified. 26133af6ab5fSopenharmony_ciAs |LANG| does not support these types, a type annotation should be omitted. 26143af6ab5fSopenharmony_ci 26153af6ab5fSopenharmony_ci|CB_BAD| 26163af6ab5fSopenharmony_ci~~~~~~~~ 26173af6ab5fSopenharmony_ci 26183af6ab5fSopenharmony_ci.. code-block:: typescript 26193af6ab5fSopenharmony_ci 26203af6ab5fSopenharmony_ci try { 26213af6ab5fSopenharmony_ci // some code 26223af6ab5fSopenharmony_ci } 26233af6ab5fSopenharmony_ci catch (a: unknown) {} 26243af6ab5fSopenharmony_ci 26253af6ab5fSopenharmony_ci|CB_OK| 26263af6ab5fSopenharmony_ci~~~~~~~ 26273af6ab5fSopenharmony_ci 26283af6ab5fSopenharmony_ci.. code:: typescript 26293af6ab5fSopenharmony_ci 26303af6ab5fSopenharmony_ci try { 26313af6ab5fSopenharmony_ci // some code 26323af6ab5fSopenharmony_ci } 26333af6ab5fSopenharmony_ci catch (a) {} 26343af6ab5fSopenharmony_ci 26353af6ab5fSopenharmony_ci|CB_SEE| 26363af6ab5fSopenharmony_ci~~~~~~~~ 26373af6ab5fSopenharmony_ci 26383af6ab5fSopenharmony_ci* :ref:`R087` 26393af6ab5fSopenharmony_ci 26403af6ab5fSopenharmony_ci.. _R080: 26413af6ab5fSopenharmony_ci 26423af6ab5fSopenharmony_ci|CB_R| #80: ``for .. in`` is not supported 26433af6ab5fSopenharmony_ci------------------------------------------ 26443af6ab5fSopenharmony_ci 26453af6ab5fSopenharmony_ci|CB_RULE| 26463af6ab5fSopenharmony_ci~~~~~~~~~ 26473af6ab5fSopenharmony_ci 26483af6ab5fSopenharmony_ci|LANG| does not support the iteration over object contents by the 26493af6ab5fSopenharmony_ci``for .. in`` loop. For objects, iteration over properties at runtime is 26503af6ab5fSopenharmony_ciconsidered redundant because object layout is known at compile time and cannot 26513af6ab5fSopenharmony_cichange at runtime. For arrays, you can iterate with the regular ``for`` loop. 26523af6ab5fSopenharmony_ci 26533af6ab5fSopenharmony_ci|CB_BAD| 26543af6ab5fSopenharmony_ci~~~~~~~~ 26553af6ab5fSopenharmony_ci 26563af6ab5fSopenharmony_ci.. code-block:: typescript 26573af6ab5fSopenharmony_ci 26583af6ab5fSopenharmony_ci let a: number[] = [1.0, 2.0, 3.0] 26593af6ab5fSopenharmony_ci for (let i in a) { 26603af6ab5fSopenharmony_ci console.log(a[i]) 26613af6ab5fSopenharmony_ci } 26623af6ab5fSopenharmony_ci 26633af6ab5fSopenharmony_ci|CB_OK| 26643af6ab5fSopenharmony_ci~~~~~~~ 26653af6ab5fSopenharmony_ci 26663af6ab5fSopenharmony_ci.. code:: typescript 26673af6ab5fSopenharmony_ci 26683af6ab5fSopenharmony_ci let a: number[] = [1.0, 2.0, 3.0] 26693af6ab5fSopenharmony_ci for (let i = 0; i < a.length; ++i) { 26703af6ab5fSopenharmony_ci console.log(a[i]) 26713af6ab5fSopenharmony_ci } 26723af6ab5fSopenharmony_ci 26733af6ab5fSopenharmony_ci|CB_SEE| 26743af6ab5fSopenharmony_ci~~~~~~~~ 26753af6ab5fSopenharmony_ci 26763af6ab5fSopenharmony_ci* :ref:`R081` 26773af6ab5fSopenharmony_ci* :ref:`R082` 26783af6ab5fSopenharmony_ci 26793af6ab5fSopenharmony_ci.. _R081: 26803af6ab5fSopenharmony_ci 26813af6ab5fSopenharmony_ci|CB_R| #81: Iterable interfaces are not supported 26823af6ab5fSopenharmony_ci------------------------------------------------- 26833af6ab5fSopenharmony_ci 26843af6ab5fSopenharmony_ci|CB_RULE| 26853af6ab5fSopenharmony_ci~~~~~~~~~ 26863af6ab5fSopenharmony_ci 26873af6ab5fSopenharmony_ci|LANG| does not support the ``Symbol`` API, ``Symbol.iterator`` and 26883af6ab5fSopenharmony_cieventually iterable interfaces. Use arrays and library-level containers to 26893af6ab5fSopenharmony_ciiterate over data. 26903af6ab5fSopenharmony_ci 26913af6ab5fSopenharmony_ci|CB_SEE| 26923af6ab5fSopenharmony_ci~~~~~~~~ 26933af6ab5fSopenharmony_ci 26943af6ab5fSopenharmony_ci* :ref:`R002` 26953af6ab5fSopenharmony_ci* :ref:`R080` 26963af6ab5fSopenharmony_ci* :ref:`R082` 26973af6ab5fSopenharmony_ci 26983af6ab5fSopenharmony_ci.. _R082: 26993af6ab5fSopenharmony_ci 27003af6ab5fSopenharmony_ci|CB_R| ``for-of`` is supported only for arrays, strings, sets, maps and classes derived from them 27013af6ab5fSopenharmony_ci------------------------------------------------------------------------------------------------- 27023af6ab5fSopenharmony_ci 27033af6ab5fSopenharmony_ci|CB_RULE| 27043af6ab5fSopenharmony_ci~~~~~~~~~ 27053af6ab5fSopenharmony_ci 27063af6ab5fSopenharmony_ci|LANG| supports the iteration over arrays, strings, sets, maps and classes 27073af6ab5fSopenharmony_ciderived from them by the ``for .. of`` loop, but does not support the 27083af6ab5fSopenharmony_ciiteration of objects content. All typed arrays from the standard 27093af6ab5fSopenharmony_cilibrary (for example, ``Int32Array``) are also supported. 27103af6ab5fSopenharmony_ci 27113af6ab5fSopenharmony_ci|CB_BAD| 27123af6ab5fSopenharmony_ci~~~~~~~~ 27133af6ab5fSopenharmony_ci 27143af6ab5fSopenharmony_ci.. code-block:: typescript 27153af6ab5fSopenharmony_ci class A { 27163af6ab5fSopenharmony_ci prop1: number; 27173af6ab5fSopenharmony_ci prop2: number; 27183af6ab5fSopenharmony_ci } 27193af6ab5fSopenharmony_ci let a = new A() 27203af6ab5fSopenharmony_ci for (let prop of a) { 27213af6ab5fSopenharmony_ci console.log(prop) 27223af6ab5fSopenharmony_ci } 27233af6ab5fSopenharmony_ci 27243af6ab5fSopenharmony_ci|CB_OK| 27253af6ab5fSopenharmony_ci~~~~~~~ 27263af6ab5fSopenharmony_ci 27273af6ab5fSopenharmony_ci.. code-block:: typescript 27283af6ab5fSopenharmony_ci 27293af6ab5fSopenharmony_ci let a = new Set<number>([1, 2, 3]) 27303af6ab5fSopenharmony_ci for (let n of a) { 27313af6ab5fSopenharmony_ci console.log(n) 27323af6ab5fSopenharmony_ci } 27333af6ab5fSopenharmony_ci|CB_SEE| 27343af6ab5fSopenharmony_ci~~~~~~~~ 27353af6ab5fSopenharmony_ci 27363af6ab5fSopenharmony_ci* :ref:`R080` 27373af6ab5fSopenharmony_ci* :ref:`R081` 27383af6ab5fSopenharmony_ci 27393af6ab5fSopenharmony_ci.. _R083: 27403af6ab5fSopenharmony_ci 27413af6ab5fSopenharmony_ci|CB_R| #83: Mapped type expression is not supported 27423af6ab5fSopenharmony_ci--------------------------------------------------- 27433af6ab5fSopenharmony_ci 27443af6ab5fSopenharmony_ci|CB_RULE| 27453af6ab5fSopenharmony_ci~~~~~~~~~ 27463af6ab5fSopenharmony_ci 27473af6ab5fSopenharmony_ci|LANG| does not support mapped types. Use other language idioms and regular classes 27483af6ab5fSopenharmony_cito achieve the same behaviour. 27493af6ab5fSopenharmony_ci 27503af6ab5fSopenharmony_ci|CB_BAD| 27513af6ab5fSopenharmony_ci~~~~~~~~ 27523af6ab5fSopenharmony_ci 27533af6ab5fSopenharmony_ci.. code-block:: typescript 27543af6ab5fSopenharmony_ci 27553af6ab5fSopenharmony_ci type OptionsFlags<Type> = { 27563af6ab5fSopenharmony_ci [Property in keyof Type]: boolean; 27573af6ab5fSopenharmony_ci } 27583af6ab5fSopenharmony_ci 27593af6ab5fSopenharmony_ci.. _R084: 27603af6ab5fSopenharmony_ci 27613af6ab5fSopenharmony_ci|CB_R| #84: ``with`` statement is not supported 27623af6ab5fSopenharmony_ci----------------------------------------------- 27633af6ab5fSopenharmony_ci 27643af6ab5fSopenharmony_ci|CB_RULE| 27653af6ab5fSopenharmony_ci~~~~~~~~~ 27663af6ab5fSopenharmony_ci 27673af6ab5fSopenharmony_ci|LANG| does not support the ``with`` statement. Use other language idioms 27683af6ab5fSopenharmony_ci(including fully qualified names of functions) to achieve the same behaviour. 27693af6ab5fSopenharmony_ci 27703af6ab5fSopenharmony_ci.. _R085: 27713af6ab5fSopenharmony_ci 27723af6ab5fSopenharmony_ci|CB_R| #85: Values computed at runtime are not supported in ``case`` statements 27733af6ab5fSopenharmony_ci------------------------------------------------------------------------------- 27743af6ab5fSopenharmony_ci 27753af6ab5fSopenharmony_ci|CB_RULE| 27763af6ab5fSopenharmony_ci~~~~~~~~~ 27773af6ab5fSopenharmony_ci 27783af6ab5fSopenharmony_ci|LANG| supports ``case`` statements that contain only compile-time values. 27793af6ab5fSopenharmony_ciUse ``if`` statements as an alternative. 27803af6ab5fSopenharmony_ci 27813af6ab5fSopenharmony_ci|CB_BAD| 27823af6ab5fSopenharmony_ci~~~~~~~~ 27833af6ab5fSopenharmony_ci 27843af6ab5fSopenharmony_ci.. code-block:: typescript 27853af6ab5fSopenharmony_ci 27863af6ab5fSopenharmony_ci let x = 2 27873af6ab5fSopenharmony_ci let y = 3 27883af6ab5fSopenharmony_ci switch (x) { 27893af6ab5fSopenharmony_ci case 1: 27903af6ab5fSopenharmony_ci console.log(1) 27913af6ab5fSopenharmony_ci break 27923af6ab5fSopenharmony_ci case 2: 27933af6ab5fSopenharmony_ci console.log(2) 27943af6ab5fSopenharmony_ci break 27953af6ab5fSopenharmony_ci case y: 27963af6ab5fSopenharmony_ci console.log(y) 27973af6ab5fSopenharmony_ci break 27983af6ab5fSopenharmony_ci default: 27993af6ab5fSopenharmony_ci console.log("other") 28003af6ab5fSopenharmony_ci } 28013af6ab5fSopenharmony_ci 28023af6ab5fSopenharmony_ci|CB_OK| 28033af6ab5fSopenharmony_ci~~~~~~~ 28043af6ab5fSopenharmony_ci 28053af6ab5fSopenharmony_ci.. code-block:: typescript 28063af6ab5fSopenharmony_ci 28073af6ab5fSopenharmony_ci let x = 2 28083af6ab5fSopenharmony_ci switch (x) { 28093af6ab5fSopenharmony_ci case 1: 28103af6ab5fSopenharmony_ci console.log(1) 28113af6ab5fSopenharmony_ci break 28123af6ab5fSopenharmony_ci case 2: 28133af6ab5fSopenharmony_ci console.log(2) 28143af6ab5fSopenharmony_ci break 28153af6ab5fSopenharmony_ci case 3: 28163af6ab5fSopenharmony_ci console.log(3) 28173af6ab5fSopenharmony_ci break 28183af6ab5fSopenharmony_ci default: 28193af6ab5fSopenharmony_ci console.log("other") 28203af6ab5fSopenharmony_ci } 28213af6ab5fSopenharmony_ci 28223af6ab5fSopenharmony_ci|CB_SEE| 28233af6ab5fSopenharmony_ci~~~~~~~~ 28243af6ab5fSopenharmony_ci 28253af6ab5fSopenharmony_ci* :ref:`R112` 28263af6ab5fSopenharmony_ci 28273af6ab5fSopenharmony_ci.. _R086: 28283af6ab5fSopenharmony_ci 28293af6ab5fSopenharmony_ci|CB_R| #86: ``switch`` statements cannot accept values of arbitrary types 28303af6ab5fSopenharmony_ci------------------------------------------------------------------------- 28313af6ab5fSopenharmony_ci 28323af6ab5fSopenharmony_ci|CB_RULE| 28333af6ab5fSopenharmony_ci~~~~~~~~~ 28343af6ab5fSopenharmony_ci 28353af6ab5fSopenharmony_ci|LANG| supports the values of the types ``char``, ``byte``, ``short``, ``int``, 28363af6ab5fSopenharmony_ci``long``, ``Char``, ``Byte``, ``Short``, ``Int``, ``Long``, ``String`` or 28373af6ab5fSopenharmony_ci``enum`` in ``switch`` statements. Use ``if`` statements in other cases. 28383af6ab5fSopenharmony_ci 28393af6ab5fSopenharmony_ci|CB_BAD| 28403af6ab5fSopenharmony_ci~~~~~~~~ 28413af6ab5fSopenharmony_ci 28423af6ab5fSopenharmony_ci.. code-block:: typescript 28433af6ab5fSopenharmony_ci 28443af6ab5fSopenharmony_ci class Point { 28453af6ab5fSopenharmony_ci x: number = 0 28463af6ab5fSopenharmony_ci y: number = 0 28473af6ab5fSopenharmony_ci } 28483af6ab5fSopenharmony_ci 28493af6ab5fSopenharmony_ci let a = new Point() 28503af6ab5fSopenharmony_ci 28513af6ab5fSopenharmony_ci switch (a) { 28523af6ab5fSopenharmony_ci case null: break; 28533af6ab5fSopenharmony_ci default: console.log("not null") 28543af6ab5fSopenharmony_ci } 28553af6ab5fSopenharmony_ci 28563af6ab5fSopenharmony_ci|CB_OK| 28573af6ab5fSopenharmony_ci~~~~~~~ 28583af6ab5fSopenharmony_ci 28593af6ab5fSopenharmony_ci.. code-block:: typescript 28603af6ab5fSopenharmony_ci 28613af6ab5fSopenharmony_ci class Point { 28623af6ab5fSopenharmony_ci x: number = 0 28633af6ab5fSopenharmony_ci y: number = 0 28643af6ab5fSopenharmony_ci } 28653af6ab5fSopenharmony_ci 28663af6ab5fSopenharmony_ci let a = new Point() 28673af6ab5fSopenharmony_ci 28683af6ab5fSopenharmony_ci if (a != null) { 28693af6ab5fSopenharmony_ci console.log("not null") 28703af6ab5fSopenharmony_ci } 28713af6ab5fSopenharmony_ci 28723af6ab5fSopenharmony_ci.. _R087: 28733af6ab5fSopenharmony_ci 28743af6ab5fSopenharmony_ci|CB_R| #87: ``throw`` statements cannot accept values of arbitrary types 28753af6ab5fSopenharmony_ci------------------------------------------------------------------------ 28763af6ab5fSopenharmony_ci 28773af6ab5fSopenharmony_ci|CB_RULE| 28783af6ab5fSopenharmony_ci~~~~~~~~~ 28793af6ab5fSopenharmony_ci 28803af6ab5fSopenharmony_ci|LANG| supports throwing only objects of the class ``Error`` or any 28813af6ab5fSopenharmony_ciderived class. Throwing an arbitrary type (i.e., a ``number`` or ``string``) 28823af6ab5fSopenharmony_ciis prohibited. 28833af6ab5fSopenharmony_ci 28843af6ab5fSopenharmony_ci|CB_BAD| 28853af6ab5fSopenharmony_ci~~~~~~~~ 28863af6ab5fSopenharmony_ci 28873af6ab5fSopenharmony_ci.. code-block:: typescript 28883af6ab5fSopenharmony_ci 28893af6ab5fSopenharmony_ci throw 4 28903af6ab5fSopenharmony_ci throw "" 28913af6ab5fSopenharmony_ci throw new Error() 28923af6ab5fSopenharmony_ci 28933af6ab5fSopenharmony_ci|CB_OK| 28943af6ab5fSopenharmony_ci~~~~~~~ 28953af6ab5fSopenharmony_ci 28963af6ab5fSopenharmony_ci.. code-block:: typescript 28973af6ab5fSopenharmony_ci 28983af6ab5fSopenharmony_ci throw new Error() 28993af6ab5fSopenharmony_ci 29003af6ab5fSopenharmony_ci.. _R088: 29013af6ab5fSopenharmony_ci 29023af6ab5fSopenharmony_ci|CB_R| #88: Each overloaded function should have its body 29033af6ab5fSopenharmony_ci--------------------------------------------------------- 29043af6ab5fSopenharmony_ci 29053af6ab5fSopenharmony_ci|CB_RULE| 29063af6ab5fSopenharmony_ci~~~~~~~~~ 29073af6ab5fSopenharmony_ci 29083af6ab5fSopenharmony_ci|LANG| does not support the |TS| style of overloading signatures with one 29093af6ab5fSopenharmony_cifunction body. Define each overloading function with its own body instead of 29103af6ab5fSopenharmony_cione body for a list of signatures. 29113af6ab5fSopenharmony_ci 29123af6ab5fSopenharmony_ci|CB_BAD| 29133af6ab5fSopenharmony_ci~~~~~~~~ 29143af6ab5fSopenharmony_ci 29153af6ab5fSopenharmony_ci.. code:: typescript 29163af6ab5fSopenharmony_ci 29173af6ab5fSopenharmony_ci function add(x: number, y: number): number 29183af6ab5fSopenharmony_ci function add(x: string, y: string): string 29193af6ab5fSopenharmony_ci function add(x: any, y: any): any { 29203af6ab5fSopenharmony_ci return x + y 29213af6ab5fSopenharmony_ci } 29223af6ab5fSopenharmony_ci 29233af6ab5fSopenharmony_ci console.log(add(2, 3)) // returns 5 29243af6ab5fSopenharmony_ci console.log(add("hello", "world")) // returns "helloworld" 29253af6ab5fSopenharmony_ci 29263af6ab5fSopenharmony_ci|CB_OK| 29273af6ab5fSopenharmony_ci~~~~~~~ 29283af6ab5fSopenharmony_ci 29293af6ab5fSopenharmony_ci.. code:: typescript 29303af6ab5fSopenharmony_ci 29313af6ab5fSopenharmony_ci function add(x: number, y: number): number { 29323af6ab5fSopenharmony_ci return x + y 29333af6ab5fSopenharmony_ci } 29343af6ab5fSopenharmony_ci 29353af6ab5fSopenharmony_ci function add(x: string, y: string): string { 29363af6ab5fSopenharmony_ci return x + y 29373af6ab5fSopenharmony_ci } 29383af6ab5fSopenharmony_ci 29393af6ab5fSopenharmony_ci function main() { 29403af6ab5fSopenharmony_ci console.log(add(2, 3)) // returns 5 29413af6ab5fSopenharmony_ci console.log(add("hello", "world")) // returns "helloworld" 29423af6ab5fSopenharmony_ci } 29433af6ab5fSopenharmony_ci 29443af6ab5fSopenharmony_ci|CB_SEE| 29453af6ab5fSopenharmony_ci~~~~~~~~ 29463af6ab5fSopenharmony_ci 29473af6ab5fSopenharmony_ci* :ref:`R089` 29483af6ab5fSopenharmony_ci 29493af6ab5fSopenharmony_ci.. _R089: 29503af6ab5fSopenharmony_ci 29513af6ab5fSopenharmony_ci|CB_R| #89: Each overloaded function with optional parameters should have its body 29523af6ab5fSopenharmony_ci---------------------------------------------------------------------------------- 29533af6ab5fSopenharmony_ci 29543af6ab5fSopenharmony_ci|CB_RULE| 29553af6ab5fSopenharmony_ci~~~~~~~~~ 29563af6ab5fSopenharmony_ci 29573af6ab5fSopenharmony_ci|LANG| does not support the |TS| style of overloading signatures with one 29583af6ab5fSopenharmony_cifunction body. Write a separate body for each overloaded signature instead of 29593af6ab5fSopenharmony_cian optional parameter like `value?` for a single body in |TS|. 29603af6ab5fSopenharmony_ci 29613af6ab5fSopenharmony_ci|CB_BAD| 29623af6ab5fSopenharmony_ci~~~~~~~~ 29633af6ab5fSopenharmony_ci 29643af6ab5fSopenharmony_ci.. code:: typescript 29653af6ab5fSopenharmony_ci 29663af6ab5fSopenharmony_ci function foo(name: string): number 29673af6ab5fSopenharmony_ci function foo(name: string, value: string): Accessor 29683af6ab5fSopenharmony_ci function foo(name: any, value?: string): any { 29693af6ab5fSopenharmony_ci // one body here 29703af6ab5fSopenharmony_ci } 29713af6ab5fSopenharmony_ci 29723af6ab5fSopenharmony_ci|CB_OK| 29733af6ab5fSopenharmony_ci~~~~~~~ 29743af6ab5fSopenharmony_ci 29753af6ab5fSopenharmony_ci.. code:: typescript 29763af6ab5fSopenharmony_ci 29773af6ab5fSopenharmony_ci function foo(name: string): string { 29783af6ab5fSopenharmony_ci return name 29793af6ab5fSopenharmony_ci } 29803af6ab5fSopenharmony_ci 29813af6ab5fSopenharmony_ci function foo(name: string, value: string): Accessor { 29823af6ab5fSopenharmony_ci return new Accessor() 29833af6ab5fSopenharmony_ci } 29843af6ab5fSopenharmony_ci 29853af6ab5fSopenharmony_ci|CB_SEE| 29863af6ab5fSopenharmony_ci~~~~~~~~ 29873af6ab5fSopenharmony_ci 29883af6ab5fSopenharmony_ci* :ref:`R088` 29893af6ab5fSopenharmony_ci 29903af6ab5fSopenharmony_ci.. _R090: 29913af6ab5fSopenharmony_ci 29923af6ab5fSopenharmony_ci|CB_R| #90: Function must have explicit return type 29933af6ab5fSopenharmony_ci--------------------------------------------------- 29943af6ab5fSopenharmony_ci 29953af6ab5fSopenharmony_ci|CB_RULE| 29963af6ab5fSopenharmony_ci~~~~~~~~~ 29973af6ab5fSopenharmony_ci 29983af6ab5fSopenharmony_ci|LANG| requires all functions to have explicit return types. For corner cases, 29993af6ab5fSopenharmony_ciuse `Object` when it is difficult to determine the return type. 30003af6ab5fSopenharmony_ci 30013af6ab5fSopenharmony_ci|CB_BAD| 30023af6ab5fSopenharmony_ci~~~~~~~~ 30033af6ab5fSopenharmony_ci 30043af6ab5fSopenharmony_ci.. code-block:: typescript 30053af6ab5fSopenharmony_ci 30063af6ab5fSopenharmony_ci function f(x: number) { 30073af6ab5fSopenharmony_ci if (x <= 0) { 30083af6ab5fSopenharmony_ci return x 30093af6ab5fSopenharmony_ci } 30103af6ab5fSopenharmony_ci return g(x) 30113af6ab5fSopenharmony_ci } 30123af6ab5fSopenharmony_ci 30133af6ab5fSopenharmony_ci function g(x: number) { 30143af6ab5fSopenharmony_ci return f(x - 1) 30153af6ab5fSopenharmony_ci } 30163af6ab5fSopenharmony_ci 30173af6ab5fSopenharmony_ci function doOperation(x: number, y: number) { 30183af6ab5fSopenharmony_ci return x + y 30193af6ab5fSopenharmony_ci } 30203af6ab5fSopenharmony_ci 30213af6ab5fSopenharmony_ci console.log(f(10)) 30223af6ab5fSopenharmony_ci console.log(doOperation(2, 3)) 30233af6ab5fSopenharmony_ci 30243af6ab5fSopenharmony_ci|CB_OK| 30253af6ab5fSopenharmony_ci~~~~~~~ 30263af6ab5fSopenharmony_ci 30273af6ab5fSopenharmony_ci.. code-block:: typescript 30283af6ab5fSopenharmony_ci 30293af6ab5fSopenharmony_ci function f(x: number): Object { 30303af6ab5fSopenharmony_ci if (x <= 0) { 30313af6ab5fSopenharmony_ci return x 30323af6ab5fSopenharmony_ci } 30333af6ab5fSopenharmony_ci return g(x) 30343af6ab5fSopenharmony_ci } 30353af6ab5fSopenharmony_ci 30363af6ab5fSopenharmony_ci function g(x: number): Object { 30373af6ab5fSopenharmony_ci return f(x - 1) 30383af6ab5fSopenharmony_ci } 30393af6ab5fSopenharmony_ci 30403af6ab5fSopenharmony_ci function doOperation(x: number, y: number): Object { 30413af6ab5fSopenharmony_ci let z = x + y 30423af6ab5fSopenharmony_ci return z 30433af6ab5fSopenharmony_ci } 30443af6ab5fSopenharmony_ci 30453af6ab5fSopenharmony_ci function main(): void { 30463af6ab5fSopenharmony_ci console.log(f(-10) as number) // returns -10 30473af6ab5fSopenharmony_ci console.log(doOperation(2, 3)) // returns 5 30483af6ab5fSopenharmony_ci } 30493af6ab5fSopenharmony_ci 30503af6ab5fSopenharmony_ci|CB_R| #91: Destructuring parameter declarations are not supported 30513af6ab5fSopenharmony_ci------------------------------------------------------------------ 30523af6ab5fSopenharmony_ci 30533af6ab5fSopenharmony_ci|CB_RULE| 30543af6ab5fSopenharmony_ci~~~~~~~~~ 30553af6ab5fSopenharmony_ci 30563af6ab5fSopenharmony_ci|LANG| requires that parameters must be passed directly to the function, and 30573af6ab5fSopenharmony_cilocal names must be assigned manually. 30583af6ab5fSopenharmony_ci 30593af6ab5fSopenharmony_ci|CB_BAD| 30603af6ab5fSopenharmony_ci~~~~~~~~ 30613af6ab5fSopenharmony_ci 30623af6ab5fSopenharmony_ci.. code:: typescript 30633af6ab5fSopenharmony_ci 30643af6ab5fSopenharmony_ci function drawText({ text = "", location: [x, y] = [0, 0], bold = false }) { 30653af6ab5fSopenharmony_ci console.log(text) 30663af6ab5fSopenharmony_ci console.log(x) 30673af6ab5fSopenharmony_ci console.log(y) 30683af6ab5fSopenharmony_ci console.log(bold) 30693af6ab5fSopenharmony_ci } 30703af6ab5fSopenharmony_ci 30713af6ab5fSopenharmony_ci drawText({ text: "Hello, world!", location: [100, 50], bold: true }) 30723af6ab5fSopenharmony_ci 30733af6ab5fSopenharmony_ci|CB_OK| 30743af6ab5fSopenharmony_ci~~~~~~~ 30753af6ab5fSopenharmony_ci 30763af6ab5fSopenharmony_ci.. code:: typescript 30773af6ab5fSopenharmony_ci 30783af6ab5fSopenharmony_ci function drawText(text: String, location: number[], bold: boolean) { 30793af6ab5fSopenharmony_ci let x = location[0] 30803af6ab5fSopenharmony_ci let y = location[1] 30813af6ab5fSopenharmony_ci console.log(text) 30823af6ab5fSopenharmony_ci console.log(x) 30833af6ab5fSopenharmony_ci console.log(y) 30843af6ab5fSopenharmony_ci console.log(bold) 30853af6ab5fSopenharmony_ci } 30863af6ab5fSopenharmony_ci 30873af6ab5fSopenharmony_ci function main() { 30883af6ab5fSopenharmony_ci drawText("Hello, world!", [100, 50], true) 30893af6ab5fSopenharmony_ci } 30903af6ab5fSopenharmony_ci 30913af6ab5fSopenharmony_ci.. _R092: 30923af6ab5fSopenharmony_ci 30933af6ab5fSopenharmony_ci|CB_R| #92: Nested functions are not supported 30943af6ab5fSopenharmony_ci---------------------------------------------- 30953af6ab5fSopenharmony_ci 30963af6ab5fSopenharmony_ci|CB_RULE| 30973af6ab5fSopenharmony_ci~~~~~~~~~ 30983af6ab5fSopenharmony_ci 30993af6ab5fSopenharmony_ci|LANG| does not support nested functions. Use lambdas instead. 31003af6ab5fSopenharmony_ci 31013af6ab5fSopenharmony_ci|CB_BAD| 31023af6ab5fSopenharmony_ci~~~~~~~~ 31033af6ab5fSopenharmony_ci 31043af6ab5fSopenharmony_ci.. code-block:: typescript 31053af6ab5fSopenharmony_ci 31063af6ab5fSopenharmony_ci function addNum(a: number, b: number): void { 31073af6ab5fSopenharmony_ci 31083af6ab5fSopenharmony_ci // nested function: 31093af6ab5fSopenharmony_ci function logToConsole(message: String): void { 31103af6ab5fSopenharmony_ci console.log(message) 31113af6ab5fSopenharmony_ci } 31123af6ab5fSopenharmony_ci 31133af6ab5fSopenharmony_ci let result = a + b 31143af6ab5fSopenharmony_ci 31153af6ab5fSopenharmony_ci // Invoking the nested function: 31163af6ab5fSopenharmony_ci logToConsole("result is " + result) 31173af6ab5fSopenharmony_ci } 31183af6ab5fSopenharmony_ci 31193af6ab5fSopenharmony_ci|CB_OK| 31203af6ab5fSopenharmony_ci~~~~~~~ 31213af6ab5fSopenharmony_ci 31223af6ab5fSopenharmony_ci.. code-block:: typescript 31233af6ab5fSopenharmony_ci 31243af6ab5fSopenharmony_ci function addNum(a: number, b: number): void { 31253af6ab5fSopenharmony_ci 31263af6ab5fSopenharmony_ci // Use lambda instead of a nested function: 31273af6ab5fSopenharmony_ci let logToConsole: (message: String): void = (message: String): void => { 31283af6ab5fSopenharmony_ci console.println(message) 31293af6ab5fSopenharmony_ci } 31303af6ab5fSopenharmony_ci 31313af6ab5fSopenharmony_ci let result = a + b 31323af6ab5fSopenharmony_ci 31333af6ab5fSopenharmony_ci logToConsole("result is " + result) 31343af6ab5fSopenharmony_ci } 31353af6ab5fSopenharmony_ci 31363af6ab5fSopenharmony_ci.. _R093: 31373af6ab5fSopenharmony_ci 31383af6ab5fSopenharmony_ci|CB_R| #93: Using ``this`` inside stand-alone functions is not supported 31393af6ab5fSopenharmony_ci------------------------------------------------------------------------ 31403af6ab5fSopenharmony_ci 31413af6ab5fSopenharmony_ci|CB_RULE| 31423af6ab5fSopenharmony_ci~~~~~~~~~ 31433af6ab5fSopenharmony_ci 31443af6ab5fSopenharmony_ci|LANG| does not support the usage of ``this`` inside stand-alone functions. 31453af6ab5fSopenharmony_ci``this`` can be used in methods only. 31463af6ab5fSopenharmony_ci 31473af6ab5fSopenharmony_ci|CB_BAD| 31483af6ab5fSopenharmony_ci~~~~~~~~ 31493af6ab5fSopenharmony_ci 31503af6ab5fSopenharmony_ci.. code-block:: typescript 31513af6ab5fSopenharmony_ci 31523af6ab5fSopenharmony_ci function foo(i: number) { 31533af6ab5fSopenharmony_ci this.count = i 31543af6ab5fSopenharmony_ci } 31553af6ab5fSopenharmony_ci 31563af6ab5fSopenharmony_ci class A { 31573af6ab5fSopenharmony_ci count: number = 1 31583af6ab5fSopenharmony_ci m = foo 31593af6ab5fSopenharmony_ci } 31603af6ab5fSopenharmony_ci 31613af6ab5fSopenharmony_ci let a = new A() 31623af6ab5fSopenharmony_ci console.log(a.count) // prints "1" 31633af6ab5fSopenharmony_ci a.m(2) 31643af6ab5fSopenharmony_ci console.log(a.count) // prints "2" 31653af6ab5fSopenharmony_ci 31663af6ab5fSopenharmony_ci 31673af6ab5fSopenharmony_ci|CB_OK| 31683af6ab5fSopenharmony_ci~~~~~~~ 31693af6ab5fSopenharmony_ci 31703af6ab5fSopenharmony_ci.. code-block:: typescript 31713af6ab5fSopenharmony_ci 31723af6ab5fSopenharmony_ci class A { 31733af6ab5fSopenharmony_ci count: number = 1 31743af6ab5fSopenharmony_ci m(i: number): void { 31753af6ab5fSopenharmony_ci this.count = i 31763af6ab5fSopenharmony_ci } 31773af6ab5fSopenharmony_ci } 31783af6ab5fSopenharmony_ci 31793af6ab5fSopenharmony_ci function main(): void { 31803af6ab5fSopenharmony_ci let a = new A() 31813af6ab5fSopenharmony_ci console.log(a.count) // prints "1" 31823af6ab5fSopenharmony_ci a.m(2) 31833af6ab5fSopenharmony_ci console.log(a.count) // prints "2" 31843af6ab5fSopenharmony_ci } 31853af6ab5fSopenharmony_ci 31863af6ab5fSopenharmony_ci.. _R094: 31873af6ab5fSopenharmony_ci 31883af6ab5fSopenharmony_ci|CB_R| #94: Generator functions are not supported 31893af6ab5fSopenharmony_ci------------------------------------------------- 31903af6ab5fSopenharmony_ci 31913af6ab5fSopenharmony_ci|CB_RULE| 31923af6ab5fSopenharmony_ci~~~~~~~~~ 31933af6ab5fSopenharmony_ci 31943af6ab5fSopenharmony_ciCurrently, |LANG| does not support generator functions. 31953af6ab5fSopenharmony_ciUse the ``async`` / ``await`` mechanism for multitasking. 31963af6ab5fSopenharmony_ci 31973af6ab5fSopenharmony_ci|CB_BAD| 31983af6ab5fSopenharmony_ci~~~~~~~~ 31993af6ab5fSopenharmony_ci 32003af6ab5fSopenharmony_ci.. code-block:: typescript 32013af6ab5fSopenharmony_ci 32023af6ab5fSopenharmony_ci function* counter(start: number, end: number) { 32033af6ab5fSopenharmony_ci for (let i = start; i <= end; i++) { 32043af6ab5fSopenharmony_ci yield i 32053af6ab5fSopenharmony_ci } 32063af6ab5fSopenharmony_ci } 32073af6ab5fSopenharmony_ci 32083af6ab5fSopenharmony_ci for (let num of counter(1, 5)) { 32093af6ab5fSopenharmony_ci console.log(num) 32103af6ab5fSopenharmony_ci } 32113af6ab5fSopenharmony_ci 32123af6ab5fSopenharmony_ci|CB_OK| 32133af6ab5fSopenharmony_ci~~~~~~~ 32143af6ab5fSopenharmony_ci 32153af6ab5fSopenharmony_ci.. code-block:: typescript 32163af6ab5fSopenharmony_ci 32173af6ab5fSopenharmony_ci for (let i = 1; i <= 5; ++i) { 32183af6ab5fSopenharmony_ci console.log(i) 32193af6ab5fSopenharmony_ci } 32203af6ab5fSopenharmony_ci 32213af6ab5fSopenharmony_ci.. _R095: 32223af6ab5fSopenharmony_ci 32233af6ab5fSopenharmony_ci|CB_R| #95: Asynchronous functions are partially supported 32243af6ab5fSopenharmony_ci---------------------------------------------------------- 32253af6ab5fSopenharmony_ci 32263af6ab5fSopenharmony_ci|CB_RULE| 32273af6ab5fSopenharmony_ci~~~~~~~~~ 32283af6ab5fSopenharmony_ci 32293af6ab5fSopenharmony_ci|LANG| partially supports asynchronous functions. 32303af6ab5fSopenharmony_ciUsing the ``launch`` mechanism (|LANG| extension to |TS|) 32313af6ab5fSopenharmony_ciis recommended for multitasking. 32323af6ab5fSopenharmony_ci 32333af6ab5fSopenharmony_ci|CB_BAD| 32343af6ab5fSopenharmony_ci~~~~~~~~ 32353af6ab5fSopenharmony_ci 32363af6ab5fSopenharmony_ci.. code-block:: typescript 32373af6ab5fSopenharmony_ci 32383af6ab5fSopenharmony_ci async function sum(numbers: number[]): Promise<number> { 32393af6ab5fSopenharmony_ci let sum = 0 32403af6ab5fSopenharmony_ci for (let num of numbers) { 32413af6ab5fSopenharmony_ci sum += await num 32423af6ab5fSopenharmony_ci } 32433af6ab5fSopenharmony_ci return sum 32443af6ab5fSopenharmony_ci } 32453af6ab5fSopenharmony_ci 32463af6ab5fSopenharmony_ci ... 32473af6ab5fSopenharmony_ci const result = await sum(5, 10) 32483af6ab5fSopenharmony_ci ... 32493af6ab5fSopenharmony_ci 32503af6ab5fSopenharmony_ci|CB_OK| 32513af6ab5fSopenharmony_ci~~~~~~~ 32523af6ab5fSopenharmony_ci 32533af6ab5fSopenharmony_ci.. code-block:: typescript 32543af6ab5fSopenharmony_ci 32553af6ab5fSopenharmony_ci function sum(numbers: number[]): number { 32563af6ab5fSopenharmony_ci let sum = 0 32573af6ab5fSopenharmony_ci for (let i = 0; i < numbers.length; ++i) { 32583af6ab5fSopenharmony_ci sum += numbers[i] 32593af6ab5fSopenharmony_ci } 32603af6ab5fSopenharmony_ci return sum 32613af6ab5fSopenharmony_ci } 32623af6ab5fSopenharmony_ci 32633af6ab5fSopenharmony_ci ... 32643af6ab5fSopenharmony_ci const result = launch sum(5, 10) // `result` will be of type `Promise<number>` 32653af6ab5fSopenharmony_ci ... 32663af6ab5fSopenharmony_ci 32673af6ab5fSopenharmony_ciNOT recommended: 32683af6ab5fSopenharmony_ci 32693af6ab5fSopenharmony_ci.. code-block:: typescript 32703af6ab5fSopenharmony_ci 32713af6ab5fSopenharmony_ci async function sum(numbers: number[]): Promise<number> { 32723af6ab5fSopenharmony_ci let sum = 0 32733af6ab5fSopenharmony_ci for (let i = 0; i < numbers.length; ++i) { 32743af6ab5fSopenharmony_ci sum += await numbers[i] 32753af6ab5fSopenharmony_ci } 32763af6ab5fSopenharmony_ci return sum 32773af6ab5fSopenharmony_ci } 32783af6ab5fSopenharmony_ci 32793af6ab5fSopenharmony_ci ... 32803af6ab5fSopenharmony_ci const result = sum(5, 10) 32813af6ab5fSopenharmony_ci ... 32823af6ab5fSopenharmony_ci 32833af6ab5fSopenharmony_ci.. _R096: 32843af6ab5fSopenharmony_ci 32853af6ab5fSopenharmony_ci|CB_R| #96: Type guarding is supported with ``instanceof`` and ``as`` 32863af6ab5fSopenharmony_ci--------------------------------------------------------------------- 32873af6ab5fSopenharmony_ci 32883af6ab5fSopenharmony_ci|CB_RULE| 32893af6ab5fSopenharmony_ci~~~~~~~~~ 32903af6ab5fSopenharmony_ci 32913af6ab5fSopenharmony_ci|LANG| does not support the ``is`` operator, which must be replaced by the 32923af6ab5fSopenharmony_ci``instanceof`` operator. Note that the fields of an object must be cast to the 32933af6ab5fSopenharmony_ciappropriate type with the ``as`` operator before use. 32943af6ab5fSopenharmony_ci 32953af6ab5fSopenharmony_ci|CB_BAD| 32963af6ab5fSopenharmony_ci~~~~~~~~ 32973af6ab5fSopenharmony_ci 32983af6ab5fSopenharmony_ci.. code-block:: typescript 32993af6ab5fSopenharmony_ci 33003af6ab5fSopenharmony_ci class Foo { 33013af6ab5fSopenharmony_ci foo: number = 0 33023af6ab5fSopenharmony_ci common: string = "" 33033af6ab5fSopenharmony_ci } 33043af6ab5fSopenharmony_ci 33053af6ab5fSopenharmony_ci class Bar { 33063af6ab5fSopenharmony_ci bar: number = 0 33073af6ab5fSopenharmony_ci common: string = "" 33083af6ab5fSopenharmony_ci } 33093af6ab5fSopenharmony_ci 33103af6ab5fSopenharmony_ci function isFoo(arg: any): arg is Foo { 33113af6ab5fSopenharmony_ci return arg.foo !== undefined 33123af6ab5fSopenharmony_ci } 33133af6ab5fSopenharmony_ci 33143af6ab5fSopenharmony_ci function doStuff(arg: Foo | Bar) { 33153af6ab5fSopenharmony_ci if (isFoo(arg)) { 33163af6ab5fSopenharmony_ci console.log(arg.foo) // OK 33173af6ab5fSopenharmony_ci console.log(arg.bar) // Error! 33183af6ab5fSopenharmony_ci } 33193af6ab5fSopenharmony_ci else { 33203af6ab5fSopenharmony_ci console.log(arg.foo) // Error! 33213af6ab5fSopenharmony_ci console.log(arg.bar) // OK 33223af6ab5fSopenharmony_ci } 33233af6ab5fSopenharmony_ci } 33243af6ab5fSopenharmony_ci 33253af6ab5fSopenharmony_ci doStuff({ foo: 123, common: '123' }) 33263af6ab5fSopenharmony_ci doStuff({ bar: 123, common: '123' }) 33273af6ab5fSopenharmony_ci 33283af6ab5fSopenharmony_ci|CB_OK| 33293af6ab5fSopenharmony_ci~~~~~~~ 33303af6ab5fSopenharmony_ci 33313af6ab5fSopenharmony_ci.. code-block:: typescript 33323af6ab5fSopenharmony_ci 33333af6ab5fSopenharmony_ci class Foo { 33343af6ab5fSopenharmony_ci foo: number = 0 33353af6ab5fSopenharmony_ci common: string = "" 33363af6ab5fSopenharmony_ci } 33373af6ab5fSopenharmony_ci 33383af6ab5fSopenharmony_ci class Bar { 33393af6ab5fSopenharmony_ci bar: number = 0 33403af6ab5fSopenharmony_ci common: string = "" 33413af6ab5fSopenharmony_ci } 33423af6ab5fSopenharmony_ci 33433af6ab5fSopenharmony_ci function isFoo(arg: Object): boolean { 33443af6ab5fSopenharmony_ci return arg instanceof Foo 33453af6ab5fSopenharmony_ci } 33463af6ab5fSopenharmony_ci 33473af6ab5fSopenharmony_ci function doStuff(arg: Object): void { 33483af6ab5fSopenharmony_ci if (isFoo(arg)) { 33493af6ab5fSopenharmony_ci let fooArg = arg as Foo 33503af6ab5fSopenharmony_ci console.log(fooArg.foo) // OK 33513af6ab5fSopenharmony_ci console.log(arg.bar) // Error! 33523af6ab5fSopenharmony_ci } 33533af6ab5fSopenharmony_ci else { 33543af6ab5fSopenharmony_ci let barArg = arg as Bar 33553af6ab5fSopenharmony_ci console.log(arg.foo) // Error! 33563af6ab5fSopenharmony_ci console.log(barArg.bar) // OK 33573af6ab5fSopenharmony_ci } 33583af6ab5fSopenharmony_ci } 33593af6ab5fSopenharmony_ci 33603af6ab5fSopenharmony_ci function main(): void { 33613af6ab5fSopenharmony_ci doStuff(new Foo()) 33623af6ab5fSopenharmony_ci doStuff(new Bar()) 33633af6ab5fSopenharmony_ci } 33643af6ab5fSopenharmony_ci 33653af6ab5fSopenharmony_ci.. _R098: 33663af6ab5fSopenharmony_ci 33673af6ab5fSopenharmony_ci|CB_R| #98: Spreading an array into function arguments is not supported 33683af6ab5fSopenharmony_ci----------------------------------------------------------------------- 33693af6ab5fSopenharmony_ci 33703af6ab5fSopenharmony_ci|CB_RULE| 33713af6ab5fSopenharmony_ci~~~~~~~~~ 33723af6ab5fSopenharmony_ci 33733af6ab5fSopenharmony_ci|LANG| does not support the spread operator. 33743af6ab5fSopenharmony_ci"Unpack" data from an array to a callee manually. 33753af6ab5fSopenharmony_ci 33763af6ab5fSopenharmony_ci|CB_BAD| 33773af6ab5fSopenharmony_ci~~~~~~~~ 33783af6ab5fSopenharmony_ci 33793af6ab5fSopenharmony_ci.. code-block:: typescript 33803af6ab5fSopenharmony_ci 33813af6ab5fSopenharmony_ci function foo(x, y, z) {} 33823af6ab5fSopenharmony_ci 33833af6ab5fSopenharmony_ci let args = [0, 1, 2] 33843af6ab5fSopenharmony_ci foo(...args) 33853af6ab5fSopenharmony_ci 33863af6ab5fSopenharmony_ci|CB_OK| 33873af6ab5fSopenharmony_ci~~~~~~~ 33883af6ab5fSopenharmony_ci 33893af6ab5fSopenharmony_ci.. code-block:: typescript 33903af6ab5fSopenharmony_ci 33913af6ab5fSopenharmony_ci function foo(x: number, y: number, z: number): void {} 33923af6ab5fSopenharmony_ci 33933af6ab5fSopenharmony_ci function main(): void { 33943af6ab5fSopenharmony_ci let args: number[] = [0, 1, 2] 33953af6ab5fSopenharmony_ci foo(args[0], args[1], args[2]) 33963af6ab5fSopenharmony_ci } 33973af6ab5fSopenharmony_ci 33983af6ab5fSopenharmony_ci.. _R099: 33993af6ab5fSopenharmony_ci 34003af6ab5fSopenharmony_ci|CB_R| #99: Spread operator is not supported 34013af6ab5fSopenharmony_ci-------------------------------------------- 34023af6ab5fSopenharmony_ci 34033af6ab5fSopenharmony_ci|CB_RULE| 34043af6ab5fSopenharmony_ci~~~~~~~~~ 34053af6ab5fSopenharmony_ci 34063af6ab5fSopenharmony_ci|LANG| does not support the spread operator. 34073af6ab5fSopenharmony_ci"Unpack" data from arrays indices manually where necessary. 34083af6ab5fSopenharmony_ci 34093af6ab5fSopenharmony_ci|CB_BAD| 34103af6ab5fSopenharmony_ci~~~~~~~~ 34113af6ab5fSopenharmony_ci 34123af6ab5fSopenharmony_ci.. code-block:: typescript 34133af6ab5fSopenharmony_ci 34143af6ab5fSopenharmony_ci let list = [1, 2] 34153af6ab5fSopenharmony_ci list = [...list, 3, 4] 34163af6ab5fSopenharmony_ci 34173af6ab5fSopenharmony_ci|CB_OK| 34183af6ab5fSopenharmony_ci~~~~~~~ 34193af6ab5fSopenharmony_ci 34203af6ab5fSopenharmony_ci.. code-block:: typescript 34213af6ab5fSopenharmony_ci 34223af6ab5fSopenharmony_ci let list: number[] = [1, 2] 34233af6ab5fSopenharmony_ci list = [list[0], list[1], 3, 4] 34243af6ab5fSopenharmony_ci 34253af6ab5fSopenharmony_ci.. _R100: 34263af6ab5fSopenharmony_ci 34273af6ab5fSopenharmony_ci|CB_R| #100: Spreading an object is not supported 34283af6ab5fSopenharmony_ci--------------------------------------------------- 34293af6ab5fSopenharmony_ci 34303af6ab5fSopenharmony_ci|CB_RULE| 34313af6ab5fSopenharmony_ci~~~~~~~~~ 34323af6ab5fSopenharmony_ci 34333af6ab5fSopenharmony_ci|LANG| does not support the spread operator. 34343af6ab5fSopenharmony_ci"Unpack" data from an object to a callee manually, field by field. 34353af6ab5fSopenharmony_ci 34363af6ab5fSopenharmony_ci|CB_BAD| 34373af6ab5fSopenharmony_ci~~~~~~~~ 34383af6ab5fSopenharmony_ci 34393af6ab5fSopenharmony_ci.. code-block:: typescript 34403af6ab5fSopenharmony_ci 34413af6ab5fSopenharmony_ci const point2d = {x: 1, y: 2} 34423af6ab5fSopenharmony_ci const point3d = {...point2d, z: 3} 34433af6ab5fSopenharmony_ci 34443af6ab5fSopenharmony_ci|CB_OK| 34453af6ab5fSopenharmony_ci~~~~~~~ 34463af6ab5fSopenharmony_ci 34473af6ab5fSopenharmony_ci.. code-block:: typescript 34483af6ab5fSopenharmony_ci 34493af6ab5fSopenharmony_ci class Point2D { 34503af6ab5fSopenharmony_ci x: number 34513af6ab5fSopenharmony_ci y: number 34523af6ab5fSopenharmony_ci 34533af6ab5fSopenharmony_ci constructor(x: number, y: number) { 34543af6ab5fSopenharmony_ci this.x = x 34553af6ab5fSopenharmony_ci this.y = y 34563af6ab5fSopenharmony_ci } 34573af6ab5fSopenharmony_ci } 34583af6ab5fSopenharmony_ci 34593af6ab5fSopenharmony_ci class Point3D { 34603af6ab5fSopenharmony_ci x: number 34613af6ab5fSopenharmony_ci y: number 34623af6ab5fSopenharmony_ci z: number 34633af6ab5fSopenharmony_ci 34643af6ab5fSopenharmony_ci constructor(x: number, y: number, z: number) { 34653af6ab5fSopenharmony_ci this.x = x 34663af6ab5fSopenharmony_ci this.y = y 34673af6ab5fSopenharmony_ci this.z = z 34683af6ab5fSopenharmony_ci } 34693af6ab5fSopenharmony_ci } 34703af6ab5fSopenharmony_ci 34713af6ab5fSopenharmony_ci function main(): void { 34723af6ab5fSopenharmony_ci const point2d = new Point2D(1, 2) 34733af6ab5fSopenharmony_ci const point3d = new Point3D(point2d.x, point2d.y, 3) 34743af6ab5fSopenharmony_ci } 34753af6ab5fSopenharmony_ci 34763af6ab5fSopenharmony_ci|CB_R| #101: Interfaces with optional properties and call signatures are not supported 34773af6ab5fSopenharmony_ci-------------------------------------------------------------------------------------- 34783af6ab5fSopenharmony_ci 34793af6ab5fSopenharmony_ci|CB_RULE| 34803af6ab5fSopenharmony_ci~~~~~~~~~ 34813af6ab5fSopenharmony_ci 34823af6ab5fSopenharmony_ci|LANG| does not support interfaces with optional properties and interfaces 34833af6ab5fSopenharmony_ciwith call signatures. 34843af6ab5fSopenharmony_ci 34853af6ab5fSopenharmony_ci|CB_BAD| 34863af6ab5fSopenharmony_ci~~~~~~~~ 34873af6ab5fSopenharmony_ci 34883af6ab5fSopenharmony_ci.. code:: typescript 34893af6ab5fSopenharmony_ci 34903af6ab5fSopenharmony_ci // Interface with optional properties 34913af6ab5fSopenharmony_ci interface Person { 34923af6ab5fSopenharmony_ci firstName: string 34933af6ab5fSopenharmony_ci lastName: string 34943af6ab5fSopenharmony_ci age?: number 34953af6ab5fSopenharmony_ci } 34963af6ab5fSopenharmony_ci 34973af6ab5fSopenharmony_ci // Interface with call signature 34983af6ab5fSopenharmony_ci interface Greet { 34993af6ab5fSopenharmony_ci (name: string): string 35003af6ab5fSopenharmony_ci } 35013af6ab5fSopenharmony_ci 35023af6ab5fSopenharmony_ci|CB_OK| 35033af6ab5fSopenharmony_ci~~~~~~~ 35043af6ab5fSopenharmony_ci 35053af6ab5fSopenharmony_ci.. code:: typescript 35063af6ab5fSopenharmony_ci 35073af6ab5fSopenharmony_ci // Use nullable type instead of optional property 35083af6ab5fSopenharmony_ci interface Person { 35093af6ab5fSopenharmony_ci firstName: string 35103af6ab5fSopenharmony_ci lastName: string 35113af6ab5fSopenharmony_ci age: number | null 35123af6ab5fSopenharmony_ci } 35133af6ab5fSopenharmony_ci 35143af6ab5fSopenharmony_ci // Use a method signature instead of call signature 35153af6ab5fSopenharmony_ci interface Greet { 35163af6ab5fSopenharmony_ci action (name: string): string 35173af6ab5fSopenharmony_ci } 35183af6ab5fSopenharmony_ci 35193af6ab5fSopenharmony_ci 35203af6ab5fSopenharmony_ci 35213af6ab5fSopenharmony_ci|CB_R| #102: Interface declarations (extends same property) 35223af6ab5fSopenharmony_ci----------------------------------------------------------- 35233af6ab5fSopenharmony_ci 35243af6ab5fSopenharmony_ci|CB_RULE| 35253af6ab5fSopenharmony_ci~~~~~~~~~ 35263af6ab5fSopenharmony_ci 35273af6ab5fSopenharmony_ci|LANG| does not allow an interface to contain two methods with signatures that 35283af6ab5fSopenharmony_ciare not distinguishable, e.g., two methods that have the same parameter lists 35293af6ab5fSopenharmony_cibut different return types. 35303af6ab5fSopenharmony_ci 35313af6ab5fSopenharmony_ci|CB_BAD| 35323af6ab5fSopenharmony_ci~~~~~~~~ 35333af6ab5fSopenharmony_ci 35343af6ab5fSopenharmony_ci.. code:: typescript 35353af6ab5fSopenharmony_ci 35363af6ab5fSopenharmony_ci interface Mover { 35373af6ab5fSopenharmony_ci getStatus(): { speed: number } 35383af6ab5fSopenharmony_ci } 35393af6ab5fSopenharmony_ci interface Shaker { 35403af6ab5fSopenharmony_ci getStatus(): { frequency: number } 35413af6ab5fSopenharmony_ci } 35423af6ab5fSopenharmony_ci 35433af6ab5fSopenharmony_ci interface MoverShaker extends Mover, Shaker { 35443af6ab5fSopenharmony_ci getStatus(): { speed: number; frequency: number } 35453af6ab5fSopenharmony_ci } 35463af6ab5fSopenharmony_ci 35473af6ab5fSopenharmony_ci class C implements MoverShaker { 35483af6ab5fSopenharmony_ci private speed: number = 0 35493af6ab5fSopenharmony_ci private frequency: number = 0 35503af6ab5fSopenharmony_ci 35513af6ab5fSopenharmony_ci getStatus() { 35523af6ab5fSopenharmony_ci return { speed: this.speed, frequency: this.frequency } 35533af6ab5fSopenharmony_ci } 35543af6ab5fSopenharmony_ci } 35553af6ab5fSopenharmony_ci 35563af6ab5fSopenharmony_ciIn |TS|, an interface that extends ``Mover`` and ``Shaker`` must declare a 35573af6ab5fSopenharmony_cinew ``getStatus`` with a combined result type. It is not allowed in |LANG|. 35583af6ab5fSopenharmony_ci 35593af6ab5fSopenharmony_ci.. _R103: 35603af6ab5fSopenharmony_ci 35613af6ab5fSopenharmony_ci|CB_R| #103: Declaration merging is not supported 35623af6ab5fSopenharmony_ci------------------------------------------------- 35633af6ab5fSopenharmony_ci 35643af6ab5fSopenharmony_ci|CB_RULE| 35653af6ab5fSopenharmony_ci~~~~~~~~~ 35663af6ab5fSopenharmony_ci 35673af6ab5fSopenharmony_ci|LANG| does not support merging declratations. All definitions of classes, 35683af6ab5fSopenharmony_ciinterfaces and so on must be kept compact in the code base. 35693af6ab5fSopenharmony_ci 35703af6ab5fSopenharmony_ci|CB_BAD| 35713af6ab5fSopenharmony_ci~~~~~~~~ 35723af6ab5fSopenharmony_ci 35733af6ab5fSopenharmony_ci.. code-block:: typescript 35743af6ab5fSopenharmony_ci 35753af6ab5fSopenharmony_ci interface Document { 35763af6ab5fSopenharmony_ci createElement(tagName: any): Element 35773af6ab5fSopenharmony_ci } 35783af6ab5fSopenharmony_ci 35793af6ab5fSopenharmony_ci interface Document { 35803af6ab5fSopenharmony_ci createElement(tagName: string): HTMLElement 35813af6ab5fSopenharmony_ci } 35823af6ab5fSopenharmony_ci 35833af6ab5fSopenharmony_ci interface Document { 35843af6ab5fSopenharmony_ci createElement(tagName: number): HTMLDivElement 35853af6ab5fSopenharmony_ci createElement(tagName: boolean): HTMLSpanElement 35863af6ab5fSopenharmony_ci createElement(tagName: string, value: number): HTMLCanvasElement 35873af6ab5fSopenharmony_ci } 35883af6ab5fSopenharmony_ci 35893af6ab5fSopenharmony_ci|CB_OK| 35903af6ab5fSopenharmony_ci~~~~~~~ 35913af6ab5fSopenharmony_ci 35923af6ab5fSopenharmony_ci.. code-block:: typescript 35933af6ab5fSopenharmony_ci 35943af6ab5fSopenharmony_ci interface Document { 35953af6ab5fSopenharmony_ci createElement(tagName: number): HTMLDivElement 35963af6ab5fSopenharmony_ci createElement(tagName: boolean): HTMLSpanElement 35973af6ab5fSopenharmony_ci createElement(tagName: string, value: number): HTMLCanvasElement 35983af6ab5fSopenharmony_ci createElement(tagName: string): HTMLElement 35993af6ab5fSopenharmony_ci createElement(tagName: Object): Element 36003af6ab5fSopenharmony_ci } 36013af6ab5fSopenharmony_ci 36023af6ab5fSopenharmony_ci.. _R104: 36033af6ab5fSopenharmony_ci 36043af6ab5fSopenharmony_ci|CB_R| #104: Interfaces cannot extend classes 36053af6ab5fSopenharmony_ci--------------------------------------------- 36063af6ab5fSopenharmony_ci 36073af6ab5fSopenharmony_ci|CB_RULE| 36083af6ab5fSopenharmony_ci~~~~~~~~~ 36093af6ab5fSopenharmony_ci 36103af6ab5fSopenharmony_ci|LANG| does not support interfaces that extend classes. Interfaces can extend 36113af6ab5fSopenharmony_cionly interfaces. 36123af6ab5fSopenharmony_ci 36133af6ab5fSopenharmony_ci|CB_BAD| 36143af6ab5fSopenharmony_ci~~~~~~~~ 36153af6ab5fSopenharmony_ci 36163af6ab5fSopenharmony_ci.. code-block:: typescript 36173af6ab5fSopenharmony_ci 36183af6ab5fSopenharmony_ci class Control { 36193af6ab5fSopenharmony_ci state: number = 0 36203af6ab5fSopenharmony_ci } 36213af6ab5fSopenharmony_ci 36223af6ab5fSopenharmony_ci interface SelectableControl extends Control { 36233af6ab5fSopenharmony_ci select(): void 36243af6ab5fSopenharmony_ci } 36253af6ab5fSopenharmony_ci 36263af6ab5fSopenharmony_ci|CB_OK| 36273af6ab5fSopenharmony_ci~~~~~~~ 36283af6ab5fSopenharmony_ci 36293af6ab5fSopenharmony_ci.. code-block:: typescript 36303af6ab5fSopenharmony_ci 36313af6ab5fSopenharmony_ci interface Control { 36323af6ab5fSopenharmony_ci state: number = 0 36333af6ab5fSopenharmony_ci } 36343af6ab5fSopenharmony_ci 36353af6ab5fSopenharmony_ci interface SelectableControl extends Control { 36363af6ab5fSopenharmony_ci select(): void 36373af6ab5fSopenharmony_ci } 36383af6ab5fSopenharmony_ci 36393af6ab5fSopenharmony_ci.. _R105: 36403af6ab5fSopenharmony_ci 36413af6ab5fSopenharmony_ci|CB_R| #105: Property-based runtime type checks are not supported 36423af6ab5fSopenharmony_ci----------------------------------------------------------------- 36433af6ab5fSopenharmony_ci 36443af6ab5fSopenharmony_ci|CB_RULE| 36453af6ab5fSopenharmony_ci~~~~~~~~~ 36463af6ab5fSopenharmony_ci 36473af6ab5fSopenharmony_ci|LANG| requires that object layout is determined in compile-time and cannot 36483af6ab5fSopenharmony_cibe changed at runtime. There for no runtime property-based checks are supported. 36493af6ab5fSopenharmony_ciIf you need to do a type cast, use ``as`` operator and use desired properties 36503af6ab5fSopenharmony_ciand methods. If some property doesn't exist then an attempt to reference it 36513af6ab5fSopenharmony_ciwill result in a compile-time error. 36523af6ab5fSopenharmony_ci 36533af6ab5fSopenharmony_ci|CB_BAD| 36543af6ab5fSopenharmony_ci~~~~~~~~ 36553af6ab5fSopenharmony_ci 36563af6ab5fSopenharmony_ci.. code-block:: typescript 36573af6ab5fSopenharmony_ci 36583af6ab5fSopenharmony_ci class A { 36593af6ab5fSopenharmony_ci foo() {} 36603af6ab5fSopenharmony_ci bar() {} 36613af6ab5fSopenharmony_ci } 36623af6ab5fSopenharmony_ci 36633af6ab5fSopenharmony_ci function getSomeObject() { 36643af6ab5fSopenharmony_ci return new A() 36653af6ab5fSopenharmony_ci } 36663af6ab5fSopenharmony_ci 36673af6ab5fSopenharmony_ci let obj: any = getSomeObject() 36683af6ab5fSopenharmony_ci if (obj && obj.foo && obj.bar) { 36693af6ab5fSopenharmony_ci console.log("Yes") // prints "Yes" in this example 36703af6ab5fSopenharmony_ci } else { 36713af6ab5fSopenharmony_ci console.log("No") 36723af6ab5fSopenharmony_ci } 36733af6ab5fSopenharmony_ci 36743af6ab5fSopenharmony_ci|CB_OK| 36753af6ab5fSopenharmony_ci~~~~~~~ 36763af6ab5fSopenharmony_ci 36773af6ab5fSopenharmony_ci.. code-block:: typescript 36783af6ab5fSopenharmony_ci 36793af6ab5fSopenharmony_ci class A { 36803af6ab5fSopenharmony_ci foo(): void {} 36813af6ab5fSopenharmony_ci bar(): void {} 36823af6ab5fSopenharmony_ci } 36833af6ab5fSopenharmony_ci 36843af6ab5fSopenharmony_ci function getSomeObject(): A { 36853af6ab5fSopenharmony_ci return new A() 36863af6ab5fSopenharmony_ci } 36873af6ab5fSopenharmony_ci 36883af6ab5fSopenharmony_ci function main(): void { 36893af6ab5fSopenharmony_ci let tmp: Object = getSomeObject() 36903af6ab5fSopenharmony_ci let obj: A = tmp as A 36913af6ab5fSopenharmony_ci obj.foo() // OK 36923af6ab5fSopenharmony_ci obj.bar() // OK 36933af6ab5fSopenharmony_ci obj.some_foo() // Compile-time error: Method some_foo does not exist on this type 36943af6ab5fSopenharmony_ci } 36953af6ab5fSopenharmony_ci 36963af6ab5fSopenharmony_ci|CB_SEE| 36973af6ab5fSopenharmony_ci~~~~~~~~ 36983af6ab5fSopenharmony_ci 36993af6ab5fSopenharmony_ci* :ref:`R001` 37003af6ab5fSopenharmony_ci* :ref:`R002` 37013af6ab5fSopenharmony_ci* :ref:`R052` 37023af6ab5fSopenharmony_ci* :ref:`R059` 37033af6ab5fSopenharmony_ci* :ref:`R060` 37043af6ab5fSopenharmony_ci* :ref:`R066` 37053af6ab5fSopenharmony_ci* :ref:`R109` 37063af6ab5fSopenharmony_ci 37073af6ab5fSopenharmony_ci.. _R106: 37083af6ab5fSopenharmony_ci 37093af6ab5fSopenharmony_ci|CB_R| #106: Constructor function type is not supported 37103af6ab5fSopenharmony_ci------------------------------------------------------- 37113af6ab5fSopenharmony_ci 37123af6ab5fSopenharmony_ci|CB_RULE| 37133af6ab5fSopenharmony_ci~~~~~~~~~ 37143af6ab5fSopenharmony_ci 37153af6ab5fSopenharmony_ci|LANG| does not support the usage of the constructor function type. 37163af6ab5fSopenharmony_ciUse lambdas instead, as they can be generalized to several types of objects. 37173af6ab5fSopenharmony_ci 37183af6ab5fSopenharmony_ci|CB_BAD| 37193af6ab5fSopenharmony_ci~~~~~~~~ 37203af6ab5fSopenharmony_ci 37213af6ab5fSopenharmony_ci.. code-block:: typescript 37223af6ab5fSopenharmony_ci 37233af6ab5fSopenharmony_ci class Person { 37243af6ab5fSopenharmony_ci constructor( 37253af6ab5fSopenharmony_ci name: string, 37263af6ab5fSopenharmony_ci age: number 37273af6ab5fSopenharmony_ci ) {} 37283af6ab5fSopenharmony_ci } 37293af6ab5fSopenharmony_ci 37303af6ab5fSopenharmony_ci type PersonConstructor = new (name: string, age: number) => Person 37313af6ab5fSopenharmony_ci 37323af6ab5fSopenharmony_ci function createPerson(Ctor: PersonConstructor, name: string, age: number): Person { 37333af6ab5fSopenharmony_ci return new Ctor(name, age) 37343af6ab5fSopenharmony_ci } 37353af6ab5fSopenharmony_ci 37363af6ab5fSopenharmony_ci const person = createPerson(Person, 'John', 30) 37373af6ab5fSopenharmony_ci 37383af6ab5fSopenharmony_ci|CB_OK| 37393af6ab5fSopenharmony_ci~~~~~~~ 37403af6ab5fSopenharmony_ci 37413af6ab5fSopenharmony_ci.. code-block:: typescript 37423af6ab5fSopenharmony_ci 37433af6ab5fSopenharmony_ci class Person { 37443af6ab5fSopenharmony_ci constructor( 37453af6ab5fSopenharmony_ci name: string, 37463af6ab5fSopenharmony_ci age: number 37473af6ab5fSopenharmony_ci ) {} 37483af6ab5fSopenharmony_ci } 37493af6ab5fSopenharmony_ci 37503af6ab5fSopenharmony_ci let PersonConstructor: (name: string, age: number): Person = (name: string, age: number): Person => { 37513af6ab5fSopenharmony_ci return new Person(name, age) 37523af6ab5fSopenharmony_ci } 37533af6ab5fSopenharmony_ci 37543af6ab5fSopenharmony_ci function createPerson(Ctor: (name: string, age: number): Person, name: string, age: number): Person { 37553af6ab5fSopenharmony_ci return PersonConstructor(name, age) 37563af6ab5fSopenharmony_ci } 37573af6ab5fSopenharmony_ci 37583af6ab5fSopenharmony_ci function main(): void { 37593af6ab5fSopenharmony_ci const person = createPerson(PersonConstructor, "John", 30) 37603af6ab5fSopenharmony_ci } 37613af6ab5fSopenharmony_ci 37623af6ab5fSopenharmony_ci.. _R107: 37633af6ab5fSopenharmony_ci 37643af6ab5fSopenharmony_ci|CB_R| #107: Constructor declarations 37653af6ab5fSopenharmony_ci------------------------------------- 37663af6ab5fSopenharmony_ci 37673af6ab5fSopenharmony_ci|CB_RULE| 37683af6ab5fSopenharmony_ci~~~~~~~~~ 37693af6ab5fSopenharmony_ci 37703af6ab5fSopenharmony_ci|LANG| does not support optional parameters in constructors. 37713af6ab5fSopenharmony_ciConstructors are not inherited from a superclass to a subclass. Use overloading 37723af6ab5fSopenharmony_ciconstructors instead of constructors with optional parameters: 37733af6ab5fSopenharmony_ci 37743af6ab5fSopenharmony_ci|CB_BAD| 37753af6ab5fSopenharmony_ci~~~~~~~~ 37763af6ab5fSopenharmony_ci 37773af6ab5fSopenharmony_ci.. code:: typescript 37783af6ab5fSopenharmony_ci 37793af6ab5fSopenharmony_ci class Foo { 37803af6ab5fSopenharmony_ci constructor(bar: string = 'default', baz?: number) {} 37813af6ab5fSopenharmony_ci } 37823af6ab5fSopenharmony_ci 37833af6ab5fSopenharmony_ci|CB_OK| 37843af6ab5fSopenharmony_ci~~~~~~~ 37853af6ab5fSopenharmony_ci 37863af6ab5fSopenharmony_ci.. code:: typescript 37873af6ab5fSopenharmony_ci 37883af6ab5fSopenharmony_ci class Foo { 37893af6ab5fSopenharmony_ci constructor(bar: string) {} 37903af6ab5fSopenharmony_ci constructor(bar: string, baz: number) {} 37913af6ab5fSopenharmony_ci } 37923af6ab5fSopenharmony_ci 37933af6ab5fSopenharmony_ci|CB_RULE| 37943af6ab5fSopenharmony_ci~~~~~~~~~ 37953af6ab5fSopenharmony_ci 37963af6ab5fSopenharmony_ciIn |LANG|, constructors are not inherited from a superclass. 37973af6ab5fSopenharmony_ci 37983af6ab5fSopenharmony_ci|CB_BAD| 37993af6ab5fSopenharmony_ci~~~~~~~~ 38003af6ab5fSopenharmony_ci 38013af6ab5fSopenharmony_ciThe constructor defined in a superclass can be used in a subclass. 38023af6ab5fSopenharmony_ci 38033af6ab5fSopenharmony_ci.. code:: typescript 38043af6ab5fSopenharmony_ci 38053af6ab5fSopenharmony_ci class C1 { 38063af6ab5fSopenharmony_ci constructor(bar: string, baz: number) {} 38073af6ab5fSopenharmony_ci } 38083af6ab5fSopenharmony_ci class C2 extends Foo {} 38093af6ab5fSopenharmony_ci 38103af6ab5fSopenharmony_ci let c = C2("a", "b") 38113af6ab5fSopenharmony_ci 38123af6ab5fSopenharmony_ci|CB_OK| 38133af6ab5fSopenharmony_ci~~~~~~~ 38143af6ab5fSopenharmony_ci 38153af6ab5fSopenharmony_ciA subclass must define its own constructor. 38163af6ab5fSopenharmony_ci 38173af6ab5fSopenharmony_ci.. code:: typescript 38183af6ab5fSopenharmony_ci 38193af6ab5fSopenharmony_ci class C1 { 38203af6ab5fSopenharmony_ci constructor(bar: string, baz: number) {} 38213af6ab5fSopenharmony_ci } 38223af6ab5fSopenharmony_ci class C2 extends Foo { 38233af6ab5fSopenharmony_ci constructor(bar: string, baz: number) { 38243af6ab5fSopenharmony_ci super(bar, string) 38253af6ab5fSopenharmony_ci } 38263af6ab5fSopenharmony_ci } 38273af6ab5fSopenharmony_ci 38283af6ab5fSopenharmony_ci let c = C2("a", "b") 38293af6ab5fSopenharmony_ci 38303af6ab5fSopenharmony_ci|CB_SEE| 38313af6ab5fSopenharmony_ci~~~~~~~~ 38323af6ab5fSopenharmony_ci 38333af6ab5fSopenharmony_ci* :ref:`R015` 38343af6ab5fSopenharmony_ci 38353af6ab5fSopenharmony_ci.. _R108: 38363af6ab5fSopenharmony_ci 38373af6ab5fSopenharmony_ci|CB_R| #108: Overloaded constructors with shared body are not supported 38383af6ab5fSopenharmony_ci----------------------------------------------------------------------- 38393af6ab5fSopenharmony_ci 38403af6ab5fSopenharmony_ci|CB_RULE| 38413af6ab5fSopenharmony_ci~~~~~~~~~ 38423af6ab5fSopenharmony_ci 38433af6ab5fSopenharmony_ci|LANG| does not support sharing a body between function overloads. 38443af6ab5fSopenharmony_ciThe shared body feature for ``constructor`` is not supported, either. 38453af6ab5fSopenharmony_ciOverload constructor with a separate body for each signature. 38463af6ab5fSopenharmony_ci 38473af6ab5fSopenharmony_ci|CB_BAD| 38483af6ab5fSopenharmony_ci~~~~~~~~ 38493af6ab5fSopenharmony_ci 38503af6ab5fSopenharmony_ci.. code-block:: typescript 38513af6ab5fSopenharmony_ci 38523af6ab5fSopenharmony_ci class Person { 38533af6ab5fSopenharmony_ci name: string 38543af6ab5fSopenharmony_ci age: number 38553af6ab5fSopenharmony_ci 38563af6ab5fSopenharmony_ci constructor(name: string, age?: number) { 38573af6ab5fSopenharmony_ci this.name = name 38583af6ab5fSopenharmony_ci if (age) { 38593af6ab5fSopenharmony_ci this.age = age 38603af6ab5fSopenharmony_ci } else { 38613af6ab5fSopenharmony_ci this.age = 0 38623af6ab5fSopenharmony_ci } 38633af6ab5fSopenharmony_ci } 38643af6ab5fSopenharmony_ci } 38653af6ab5fSopenharmony_ci 38663af6ab5fSopenharmony_ci|CB_OK| 38673af6ab5fSopenharmony_ci~~~~~~~ 38683af6ab5fSopenharmony_ci 38693af6ab5fSopenharmony_ci.. code-block:: typescript 38703af6ab5fSopenharmony_ci 38713af6ab5fSopenharmony_ci class Person { 38723af6ab5fSopenharmony_ci name: string 38733af6ab5fSopenharmony_ci age: number 38743af6ab5fSopenharmony_ci 38753af6ab5fSopenharmony_ci constructor(name: string, age: number) { 38763af6ab5fSopenharmony_ci this.name = name 38773af6ab5fSopenharmony_ci this.age = age 38783af6ab5fSopenharmony_ci } 38793af6ab5fSopenharmony_ci 38803af6ab5fSopenharmony_ci constructor(name: string) { 38813af6ab5fSopenharmony_ci this.name = name 38823af6ab5fSopenharmony_ci this.age = 0 38833af6ab5fSopenharmony_ci } 38843af6ab5fSopenharmony_ci } 38853af6ab5fSopenharmony_ci 38863af6ab5fSopenharmony_ci.. _R109: 38873af6ab5fSopenharmony_ci 38883af6ab5fSopenharmony_ci|CB_R| #109: Dynamic property declaration is not supported 38893af6ab5fSopenharmony_ci---------------------------------------------------------- 38903af6ab5fSopenharmony_ci 38913af6ab5fSopenharmony_ci|CB_RULE| 38923af6ab5fSopenharmony_ci~~~~~~~~~ 38933af6ab5fSopenharmony_ci 38943af6ab5fSopenharmony_ci|LANG| does not support dynamic property declaration. All object properties must 38953af6ab5fSopenharmony_cibe declared immediately in the class. While it can be replaced with an array 38963af6ab5fSopenharmony_ciof objects, it is still better to adhere to the static language paradigm and 38973af6ab5fSopenharmony_cideclare fields, their names and types explicitly. 38983af6ab5fSopenharmony_ci 38993af6ab5fSopenharmony_ci|CB_BAD| 39003af6ab5fSopenharmony_ci~~~~~~~~ 39013af6ab5fSopenharmony_ci 39023af6ab5fSopenharmony_ci.. code-block:: typescript 39033af6ab5fSopenharmony_ci 39043af6ab5fSopenharmony_ci class Person { 39053af6ab5fSopenharmony_ci name: string = "" 39063af6ab5fSopenharmony_ci age: number = 0 39073af6ab5fSopenharmony_ci [key: string]: string | number 39083af6ab5fSopenharmony_ci } 39093af6ab5fSopenharmony_ci 39103af6ab5fSopenharmony_ci const person: Person = { 39113af6ab5fSopenharmony_ci name: "John", 39123af6ab5fSopenharmony_ci age: 30, 39133af6ab5fSopenharmony_ci email: "john@example.com", 39143af6ab5fSopenharmony_ci phone: 1234567890, 39153af6ab5fSopenharmony_ci } 39163af6ab5fSopenharmony_ci 39173af6ab5fSopenharmony_ci|CB_OK| 39183af6ab5fSopenharmony_ci~~~~~~~ 39193af6ab5fSopenharmony_ci 39203af6ab5fSopenharmony_ci.. code-block:: typescript 39213af6ab5fSopenharmony_ci 39223af6ab5fSopenharmony_ci class Person { 39233af6ab5fSopenharmony_ci name: string 39243af6ab5fSopenharmony_ci age: number 39253af6ab5fSopenharmony_ci email: string 39263af6ab5fSopenharmony_ci phone: number 39273af6ab5fSopenharmony_ci 39283af6ab5fSopenharmony_ci constructor(name: string, age: number, email: string, phone: number) { 39293af6ab5fSopenharmony_ci this.name = name 39303af6ab5fSopenharmony_ci this.age = age 39313af6ab5fSopenharmony_ci this.email = email 39323af6ab5fSopenharmony_ci this.phone = phone 39333af6ab5fSopenharmony_ci } 39343af6ab5fSopenharmony_ci } 39353af6ab5fSopenharmony_ci 39363af6ab5fSopenharmony_ci function main(): void { 39373af6ab5fSopenharmony_ci const person: Person = new Person("John", 30, "john@example.com", 1234567890) 39383af6ab5fSopenharmony_ci } 39393af6ab5fSopenharmony_ci 39403af6ab5fSopenharmony_ci|CB_SEE| 39413af6ab5fSopenharmony_ci~~~~~~~~ 39423af6ab5fSopenharmony_ci 39433af6ab5fSopenharmony_ci* :ref:`R001` 39443af6ab5fSopenharmony_ci* :ref:`R002` 39453af6ab5fSopenharmony_ci* :ref:`R052` 39463af6ab5fSopenharmony_ci* :ref:`R059` 39473af6ab5fSopenharmony_ci* :ref:`R060` 39483af6ab5fSopenharmony_ci* :ref:`R066` 39493af6ab5fSopenharmony_ci* :ref:`R105` 39503af6ab5fSopenharmony_ci 39513af6ab5fSopenharmony_ci.. _R111: 39523af6ab5fSopenharmony_ci 39533af6ab5fSopenharmony_ci|CB_R| #111: Explicit values for enumeration constants are not supported 39543af6ab5fSopenharmony_ci------------------------------------------------------------------------ 39553af6ab5fSopenharmony_ci 39563af6ab5fSopenharmony_ci|CB_RULE| 39573af6ab5fSopenharmony_ci~~~~~~~~~ 39583af6ab5fSopenharmony_ci 39593af6ab5fSopenharmony_ciCurrently, |LANG| does not support assigning explicit values for ``enums``. 39603af6ab5fSopenharmony_ci 39613af6ab5fSopenharmony_ci|CB_BAD| 39623af6ab5fSopenharmony_ci~~~~~~~~ 39633af6ab5fSopenharmony_ci 39643af6ab5fSopenharmony_ci.. code-block:: typescript 39653af6ab5fSopenharmony_ci 39663af6ab5fSopenharmony_ci enum E { 39673af6ab5fSopenharmony_ci A, 39683af6ab5fSopenharmony_ci B, 39693af6ab5fSopenharmony_ci C = 10, 39703af6ab5fSopenharmony_ci D 39713af6ab5fSopenharmony_ci } 39723af6ab5fSopenharmony_ci 39733af6ab5fSopenharmony_ci|CB_OK| 39743af6ab5fSopenharmony_ci~~~~~~~ 39753af6ab5fSopenharmony_ci 39763af6ab5fSopenharmony_ci.. code-block:: typescript 39773af6ab5fSopenharmony_ci 39783af6ab5fSopenharmony_ci enum E { 39793af6ab5fSopenharmony_ci A, 39803af6ab5fSopenharmony_ci B, 39813af6ab5fSopenharmony_ci C = 10, // Compile-time error: assigning out of order values for enums is not supported 39823af6ab5fSopenharmony_ci D 39833af6ab5fSopenharmony_ci } 39843af6ab5fSopenharmony_ci 39853af6ab5fSopenharmony_ci enum E_fixed { 39863af6ab5fSopenharmony_ci A, 39873af6ab5fSopenharmony_ci B, 39883af6ab5fSopenharmony_ci C, // OK 39893af6ab5fSopenharmony_ci D 39903af6ab5fSopenharmony_ci } 39913af6ab5fSopenharmony_ci 39923af6ab5fSopenharmony_ci.. _R112: 39933af6ab5fSopenharmony_ci 39943af6ab5fSopenharmony_ci.. _R113: 39953af6ab5fSopenharmony_ci 39963af6ab5fSopenharmony_ci|CB_R| #113: ``enum`` declaration merging is not supported 39973af6ab5fSopenharmony_ci---------------------------------------------------------- 39983af6ab5fSopenharmony_ci 39993af6ab5fSopenharmony_ci|CB_RULE| 40003af6ab5fSopenharmony_ci~~~~~~~~~ 40013af6ab5fSopenharmony_ci 40023af6ab5fSopenharmony_ci|LANG| does not support merging declratations for ``enum``. 40033af6ab5fSopenharmony_ciThe declaration of each ``enum`` must be kept compact in the code base. 40043af6ab5fSopenharmony_ci 40053af6ab5fSopenharmony_ci|CB_BAD| 40063af6ab5fSopenharmony_ci~~~~~~~~ 40073af6ab5fSopenharmony_ci 40083af6ab5fSopenharmony_ci.. code:: typescript 40093af6ab5fSopenharmony_ci 40103af6ab5fSopenharmony_ci enum Color { 40113af6ab5fSopenharmony_ci RED, 40123af6ab5fSopenharmony_ci GREEN 40133af6ab5fSopenharmony_ci } 40143af6ab5fSopenharmony_ci enum Color { 40153af6ab5fSopenharmony_ci YELLOW 40163af6ab5fSopenharmony_ci } 40173af6ab5fSopenharmony_ci enum Color { 40183af6ab5fSopenharmony_ci BLACK, 40193af6ab5fSopenharmony_ci BLUE 40203af6ab5fSopenharmony_ci } 40213af6ab5fSopenharmony_ci 40223af6ab5fSopenharmony_ci|CB_OK| 40233af6ab5fSopenharmony_ci~~~~~~~ 40243af6ab5fSopenharmony_ci 40253af6ab5fSopenharmony_ci.. code:: typescript 40263af6ab5fSopenharmony_ci 40273af6ab5fSopenharmony_ci enum Color { 40283af6ab5fSopenharmony_ci RED, 40293af6ab5fSopenharmony_ci GREEN, 40303af6ab5fSopenharmony_ci YELLOW, 40313af6ab5fSopenharmony_ci BLACK, 40323af6ab5fSopenharmony_ci BLUE 40333af6ab5fSopenharmony_ci } 40343af6ab5fSopenharmony_ci 40353af6ab5fSopenharmony_ci.. _R114: 40363af6ab5fSopenharmony_ci 40373af6ab5fSopenharmony_ci|CB_R| #114: Namespaces cannot be used as objects 40383af6ab5fSopenharmony_ci------------------------------------------------- 40393af6ab5fSopenharmony_ci 40403af6ab5fSopenharmony_ci|CB_RULE| 40413af6ab5fSopenharmony_ci~~~~~~~~~ 40423af6ab5fSopenharmony_ci 40433af6ab5fSopenharmony_ci|LANG| does not support the usage of namespaces as objects. 40443af6ab5fSopenharmony_ciClasses or modules can be interpreted as analogues of namespaces. 40453af6ab5fSopenharmony_ci 40463af6ab5fSopenharmony_ci|CB_BAD| 40473af6ab5fSopenharmony_ci~~~~~~~~ 40483af6ab5fSopenharmony_ci 40493af6ab5fSopenharmony_ci.. code-block:: typescript 40503af6ab5fSopenharmony_ci 40513af6ab5fSopenharmony_ci namespace MyNamespace { 40523af6ab5fSopenharmony_ci export let x: number 40533af6ab5fSopenharmony_ci } 40543af6ab5fSopenharmony_ci 40553af6ab5fSopenharmony_ci let m = MyNamespace 40563af6ab5fSopenharmony_ci m.x = 2 40573af6ab5fSopenharmony_ci 40583af6ab5fSopenharmony_ci|CB_OK| 40593af6ab5fSopenharmony_ci~~~~~~~ 40603af6ab5fSopenharmony_ci 40613af6ab5fSopenharmony_ci.. code-block:: typescript 40623af6ab5fSopenharmony_ci 40633af6ab5fSopenharmony_ci namespace MyNamespace { 40643af6ab5fSopenharmony_ci export let x: number 40653af6ab5fSopenharmony_ci } 40663af6ab5fSopenharmony_ci 40673af6ab5fSopenharmony_ci MyNamespace.x = 2 40683af6ab5fSopenharmony_ci 40693af6ab5fSopenharmony_ci.. _R115: 40703af6ab5fSopenharmony_ci 40713af6ab5fSopenharmony_ci|CB_R| #115: Scripts and modules 40723af6ab5fSopenharmony_ci-------------------------------- 40733af6ab5fSopenharmony_ci 40743af6ab5fSopenharmony_ci|CB_RULE| 40753af6ab5fSopenharmony_ci~~~~~~~~~ 40763af6ab5fSopenharmony_ci 40773af6ab5fSopenharmony_ciIn general, scripts and modules in |LANG| are very close to |TS|. 40783af6ab5fSopenharmony_ciDifferences are described in separate recipes. 40793af6ab5fSopenharmony_ci 40803af6ab5fSopenharmony_ci|CB_SEE| 40813af6ab5fSopenharmony_ci~~~~~~~~ 40823af6ab5fSopenharmony_ci 40833af6ab5fSopenharmony_ci* :ref:`R117` 40843af6ab5fSopenharmony_ci* :ref:`R118` 40853af6ab5fSopenharmony_ci* :ref:`R119` 40863af6ab5fSopenharmony_ci* :ref:`R120` 40873af6ab5fSopenharmony_ci* :ref:`R121` 40883af6ab5fSopenharmony_ci* :ref:`R122` 40893af6ab5fSopenharmony_ci* :ref:`R124` 40903af6ab5fSopenharmony_ci* :ref:`R125` 40913af6ab5fSopenharmony_ci* :ref:`R126` 40923af6ab5fSopenharmony_ci 40933af6ab5fSopenharmony_ci.. _R116: 40943af6ab5fSopenharmony_ci 40953af6ab5fSopenharmony_ci|CB_R| #116: Non-declaration statements in namespaces are not supported 40963af6ab5fSopenharmony_ci----------------------------------------------------------------------- 40973af6ab5fSopenharmony_ci 40983af6ab5fSopenharmony_ci|CB_RULE| 40993af6ab5fSopenharmony_ci~~~~~~~~~ 41003af6ab5fSopenharmony_ci 41013af6ab5fSopenharmony_ci|LANG| does not support statements in namespaces. Use a function to exectute statements. 41023af6ab5fSopenharmony_ci 41033af6ab5fSopenharmony_ci|CB_BAD| 41043af6ab5fSopenharmony_ci~~~~~~~~~ 41053af6ab5fSopenharmony_ci 41063af6ab5fSopenharmony_ci.. code:: typescript 41073af6ab5fSopenharmony_ci 41083af6ab5fSopenharmony_ci namespace A { 41093af6ab5fSopenharmony_ci export let x: number 41103af6ab5fSopenharmony_ci x = 1 41113af6ab5fSopenharmony_ci } 41123af6ab5fSopenharmony_ci 41133af6ab5fSopenharmony_ci|CB_OK| 41143af6ab5fSopenharmony_ci~~~~~~~~~ 41153af6ab5fSopenharmony_ci 41163af6ab5fSopenharmony_ciInitialization function should be called to execute statements. 41173af6ab5fSopenharmony_ci 41183af6ab5fSopenharmony_ci.. code:: typescript 41193af6ab5fSopenharmony_ci 41203af6ab5fSopenharmony_ci namespace A { 41213af6ab5fSopenharmony_ci export let x: number 41223af6ab5fSopenharmony_ci 41233af6ab5fSopenharmony_ci export function init() { 41243af6ab5fSopenharmony_ci x = 1 41253af6ab5fSopenharmony_ci } 41263af6ab5fSopenharmony_ci } 41273af6ab5fSopenharmony_ci A.init() 41283af6ab5fSopenharmony_ci 41293af6ab5fSopenharmony_ci 41303af6ab5fSopenharmony_ci.. _R117: 41313af6ab5fSopenharmony_ci 41323af6ab5fSopenharmony_ci|CB_R| #117: Statement as top-level element 41333af6ab5fSopenharmony_ci------------------------------------------- 41343af6ab5fSopenharmony_ci 41353af6ab5fSopenharmony_ci|CB_RULE| 41363af6ab5fSopenharmony_ci~~~~~~~~~ 41373af6ab5fSopenharmony_ci 41383af6ab5fSopenharmony_ci|LANG| does not support statements as top-level elements. Statements must be 41393af6ab5fSopenharmony_ciplaced in a block ``{}``. 41403af6ab5fSopenharmony_ci 41413af6ab5fSopenharmony_ci|CB_BAD| 41423af6ab5fSopenharmony_ci~~~~~~~~~ 41433af6ab5fSopenharmony_ci 41443af6ab5fSopenharmony_ci.. code:: typescript 41453af6ab5fSopenharmony_ci 41463af6ab5fSopenharmony_ci let a = 1 41473af6ab5fSopenharmony_ci let b = 2 41483af6ab5fSopenharmony_ci if (b == a) { 41493af6ab5fSopenharmony_ci console.log("a EQ b") 41503af6ab5fSopenharmony_ci } else { 41513af6ab5fSopenharmony_ci console.log("a NEQ b") 41523af6ab5fSopenharmony_ci } 41533af6ab5fSopenharmony_ci 41543af6ab5fSopenharmony_ci|CB_OK| 41553af6ab5fSopenharmony_ci~~~~~~~~~ 41563af6ab5fSopenharmony_ci 41573af6ab5fSopenharmony_ci.. code:: typescript 41583af6ab5fSopenharmony_ci 41593af6ab5fSopenharmony_ci // A block can be a top-level element, 41603af6ab5fSopenharmony_ci // put statements inside one or several blocks: 41613af6ab5fSopenharmony_ci { 41623af6ab5fSopenharmony_ci let a = 1 41633af6ab5fSopenharmony_ci let b = 2 41643af6ab5fSopenharmony_ci } 41653af6ab5fSopenharmony_ci 41663af6ab5fSopenharmony_ci { 41673af6ab5fSopenharmony_ci if (b == a) { 41683af6ab5fSopenharmony_ci console.log("a EQ b") 41693af6ab5fSopenharmony_ci } else { 41703af6ab5fSopenharmony_ci console.log("a NEQ b") 41713af6ab5fSopenharmony_ci } 41723af6ab5fSopenharmony_ci } 41733af6ab5fSopenharmony_ci 41743af6ab5fSopenharmony_ci 41753af6ab5fSopenharmony_ci.. _R118: 41763af6ab5fSopenharmony_ci 41773af6ab5fSopenharmony_ci|CB_R| #118: Special import type declarations are not supported 41783af6ab5fSopenharmony_ci--------------------------------------------------------------- 41793af6ab5fSopenharmony_ci 41803af6ab5fSopenharmony_ci|CB_RULE| 41813af6ab5fSopenharmony_ci~~~~~~~~~ 41823af6ab5fSopenharmony_ci 41833af6ab5fSopenharmony_ci|LANG| does not have a special notation for importing types. 41843af6ab5fSopenharmony_ciUse ordinary import instead. 41853af6ab5fSopenharmony_ci 41863af6ab5fSopenharmony_ci|CB_BAD| 41873af6ab5fSopenharmony_ci~~~~~~~~ 41883af6ab5fSopenharmony_ci 41893af6ab5fSopenharmony_ci.. code:: typescript 41903af6ab5fSopenharmony_ci 41913af6ab5fSopenharmony_ci // Re-using the same import 41923af6ab5fSopenharmony_ci import { APIResponseType } from "./api" 41933af6ab5fSopenharmony_ci 41943af6ab5fSopenharmony_ci // Explicitly use import type 41953af6ab5fSopenharmony_ci import type { APIResponseType } from "./api" 41963af6ab5fSopenharmony_ci 41973af6ab5fSopenharmony_ci|CB_OK| 41983af6ab5fSopenharmony_ci~~~~~~~ 41993af6ab5fSopenharmony_ci 42003af6ab5fSopenharmony_ci.. code:: typescript 42013af6ab5fSopenharmony_ci 42023af6ab5fSopenharmony_ci import { APIResponseType } from "./api" 42033af6ab5fSopenharmony_ci 42043af6ab5fSopenharmony_ci|CB_SEE| 42053af6ab5fSopenharmony_ci~~~~~~~~ 42063af6ab5fSopenharmony_ci 42073af6ab5fSopenharmony_ci* :ref:`R119` 42083af6ab5fSopenharmony_ci* :ref:`R120` 42093af6ab5fSopenharmony_ci* :ref:`R121` 42103af6ab5fSopenharmony_ci 42113af6ab5fSopenharmony_ci.. _R119: 42123af6ab5fSopenharmony_ci 42133af6ab5fSopenharmony_ci|CB_R| #119: Importing a module for side-effects only is not supported 42143af6ab5fSopenharmony_ci---------------------------------------------------------------------- 42153af6ab5fSopenharmony_ci 42163af6ab5fSopenharmony_ci|CB_RULE| 42173af6ab5fSopenharmony_ci~~~~~~~~~ 42183af6ab5fSopenharmony_ci 42193af6ab5fSopenharmony_ci|LANG| does not support global variables like ``window`` to avoid 42203af6ab5fSopenharmony_ciside-effects during module importing. All variables marked as export can be 42213af6ab5fSopenharmony_ciaccessed through the ``*`` syntax. 42223af6ab5fSopenharmony_ci 42233af6ab5fSopenharmony_ci|CB_BAD| 42243af6ab5fSopenharmony_ci~~~~~~~~ 42253af6ab5fSopenharmony_ci 42263af6ab5fSopenharmony_ci.. code:: typescript 42273af6ab5fSopenharmony_ci 42283af6ab5fSopenharmony_ci // === module at "path/to/module.ts" 42293af6ab5fSopenharmony_ci export const EXAMPLE_VALUE = 42 42303af6ab5fSopenharmony_ci 42313af6ab5fSopenharmony_ci // Set a global variable 42323af6ab5fSopenharmony_ci window.MY_GLOBAL_VAR = "Hello, world!" 42333af6ab5fSopenharmony_ci 42343af6ab5fSopenharmony_ci // ==== using this module: 42353af6ab5fSopenharmony_ci import "path/to/module" 42363af6ab5fSopenharmony_ci 42373af6ab5fSopenharmony_ci|CB_OK| 42383af6ab5fSopenharmony_ci~~~~~~~ 42393af6ab5fSopenharmony_ci 42403af6ab5fSopenharmony_ci.. code:: typescript 42413af6ab5fSopenharmony_ci 42423af6ab5fSopenharmony_ci import * from "path/to/module" 42433af6ab5fSopenharmony_ci 42443af6ab5fSopenharmony_ci.. _R120: 42453af6ab5fSopenharmony_ci 42463af6ab5fSopenharmony_ci|CB_R| #120: ``import default as ...`` is not supported 42473af6ab5fSopenharmony_ci------------------------------------------------------- 42483af6ab5fSopenharmony_ci 42493af6ab5fSopenharmony_ci|CB_RULE| 42503af6ab5fSopenharmony_ci~~~~~~~~~ 42513af6ab5fSopenharmony_ci 42523af6ab5fSopenharmony_ci|LANG| does not support ``import default as ...`` syntax. 42533af6ab5fSopenharmony_ciUse explicit ``import ... from ...`` instead. 42543af6ab5fSopenharmony_ci 42553af6ab5fSopenharmony_ci|CB_BAD| 42563af6ab5fSopenharmony_ci~~~~~~~~ 42573af6ab5fSopenharmony_ci 42583af6ab5fSopenharmony_ci.. code-block:: typescript 42593af6ab5fSopenharmony_ci 42603af6ab5fSopenharmony_ci import { default as d } from "mod" 42613af6ab5fSopenharmony_ci 42623af6ab5fSopenharmony_ci|CB_OK| 42633af6ab5fSopenharmony_ci~~~~~~~ 42643af6ab5fSopenharmony_ci 42653af6ab5fSopenharmony_ci.. code-block:: typescript 42663af6ab5fSopenharmony_ci 42673af6ab5fSopenharmony_ci import d from "mod" 42683af6ab5fSopenharmony_ci 42693af6ab5fSopenharmony_ci|CB_SEE| 42703af6ab5fSopenharmony_ci~~~~~~~~ 42713af6ab5fSopenharmony_ci 42723af6ab5fSopenharmony_ci* :ref:`R122` 42733af6ab5fSopenharmony_ci 42743af6ab5fSopenharmony_ci.. _R121: 42753af6ab5fSopenharmony_ci 42763af6ab5fSopenharmony_ci|CB_R| #121: ``require`` is not supported 42773af6ab5fSopenharmony_ci----------------------------------------- 42783af6ab5fSopenharmony_ci 42793af6ab5fSopenharmony_ci|CB_RULE| 42803af6ab5fSopenharmony_ci~~~~~~~~~ 42813af6ab5fSopenharmony_ci 42823af6ab5fSopenharmony_ci|LANG| does not support importing via ``require``. Use ``import`` instead. 42833af6ab5fSopenharmony_ci 42843af6ab5fSopenharmony_ci|CB_BAD| 42853af6ab5fSopenharmony_ci~~~~~~~~ 42863af6ab5fSopenharmony_ci 42873af6ab5fSopenharmony_ci.. code-block:: typescript 42883af6ab5fSopenharmony_ci 42893af6ab5fSopenharmony_ci import m = require("mod") 42903af6ab5fSopenharmony_ci 42913af6ab5fSopenharmony_ci|CB_OK| 42923af6ab5fSopenharmony_ci~~~~~~~ 42933af6ab5fSopenharmony_ci 42943af6ab5fSopenharmony_ci.. code-block:: typescript 42953af6ab5fSopenharmony_ci 42963af6ab5fSopenharmony_ci import * as m from "mod" 42973af6ab5fSopenharmony_ci 42983af6ab5fSopenharmony_ci.. _R122: 42993af6ab5fSopenharmony_ci 43003af6ab5fSopenharmony_ci|CB_R| #122: ``export default`` is not supported 43013af6ab5fSopenharmony_ci------------------------------------------------ 43023af6ab5fSopenharmony_ci 43033af6ab5fSopenharmony_ci|CB_RULE| 43043af6ab5fSopenharmony_ci~~~~~~~~~ 43053af6ab5fSopenharmony_ci 43063af6ab5fSopenharmony_ci|LANG| does not support ``export default``. 43073af6ab5fSopenharmony_ci 43083af6ab5fSopenharmony_ci|CB_BAD| 43093af6ab5fSopenharmony_ci~~~~~~~~ 43103af6ab5fSopenharmony_ci 43113af6ab5fSopenharmony_ci.. code-block:: typescript 43123af6ab5fSopenharmony_ci 43133af6ab5fSopenharmony_ci // file1.ts 43143af6ab5fSopenharmony_ci export default class MyClass { 43153af6ab5fSopenharmony_ci // ... 43163af6ab5fSopenharmony_ci } 43173af6ab5fSopenharmony_ci 43183af6ab5fSopenharmony_ci // file2.ts 43193af6ab5fSopenharmony_ci // Can write just `MyClass` instead of `{ MyClass }` in case of default export 43203af6ab5fSopenharmony_ci import MyClass from './file1' 43213af6ab5fSopenharmony_ci 43223af6ab5fSopenharmony_ci|CB_OK| 43233af6ab5fSopenharmony_ci~~~~~~~ 43243af6ab5fSopenharmony_ci 43253af6ab5fSopenharmony_ci.. code-block:: typescript 43263af6ab5fSopenharmony_ci 43273af6ab5fSopenharmony_ci // module1 43283af6ab5fSopenharmony_ci export class MyClass { 43293af6ab5fSopenharmony_ci // ... 43303af6ab5fSopenharmony_ci } 43313af6ab5fSopenharmony_ci 43323af6ab5fSopenharmony_ci // module2 43333af6ab5fSopenharmony_ci // Use explicit name in import 43343af6ab5fSopenharmony_ci import { MyClass } from "./module1" 43353af6ab5fSopenharmony_ci 43363af6ab5fSopenharmony_ci|CB_SEE| 43373af6ab5fSopenharmony_ci~~~~~~~~ 43383af6ab5fSopenharmony_ci 43393af6ab5fSopenharmony_ci* :ref:`R120` 43403af6ab5fSopenharmony_ci 43413af6ab5fSopenharmony_ci.. _R124: 43423af6ab5fSopenharmony_ci 43433af6ab5fSopenharmony_ci|CB_R| #124: Export list declaration is not supported 43443af6ab5fSopenharmony_ci----------------------------------------------------- 43453af6ab5fSopenharmony_ci 43463af6ab5fSopenharmony_ci|CB_RULE| 43473af6ab5fSopenharmony_ci~~~~~~~~~ 43483af6ab5fSopenharmony_ci 43493af6ab5fSopenharmony_ci|LANG| does not support syntax of export list declarations. All exported 43503af6ab5fSopenharmony_cientities must be explicitly annotated with the ``export`` keyword. 43513af6ab5fSopenharmony_ci 43523af6ab5fSopenharmony_ci|CB_BAD| 43533af6ab5fSopenharmony_ci~~~~~~~~ 43543af6ab5fSopenharmony_ci 43553af6ab5fSopenharmony_ci.. code-block:: typescript 43563af6ab5fSopenharmony_ci 43573af6ab5fSopenharmony_ci export { x } 43583af6ab5fSopenharmony_ci export { x } from "mod" 43593af6ab5fSopenharmony_ci export { x, y as b, z as c } 43603af6ab5fSopenharmony_ci 43613af6ab5fSopenharmony_ci|CB_OK| 43623af6ab5fSopenharmony_ci~~~~~~~ 43633af6ab5fSopenharmony_ci 43643af6ab5fSopenharmony_ci.. code-block:: typescript 43653af6ab5fSopenharmony_ci 43663af6ab5fSopenharmony_ci let x = 1 43673af6ab5fSopenharmony_ci class MyClass {} 43683af6ab5fSopenharmony_ci export let y = x, z: number = 2 43693af6ab5fSopenharmony_ci export RenamedClass = MyClass 43703af6ab5fSopenharmony_ci 43713af6ab5fSopenharmony_ci|CB_SEE| 43723af6ab5fSopenharmony_ci~~~~~~~~ 43733af6ab5fSopenharmony_ci 43743af6ab5fSopenharmony_ci* :ref:`R125` 43753af6ab5fSopenharmony_ci* :ref:`R126` 43763af6ab5fSopenharmony_ci 43773af6ab5fSopenharmony_ci.. _R125: 43783af6ab5fSopenharmony_ci 43793af6ab5fSopenharmony_ci|CB_R| #125: Re-exporting is not supported 43803af6ab5fSopenharmony_ci------------------------------------------ 43813af6ab5fSopenharmony_ci 43823af6ab5fSopenharmony_ci|CB_RULE| 43833af6ab5fSopenharmony_ci~~~~~~~~~ 43843af6ab5fSopenharmony_ci 43853af6ab5fSopenharmony_ci|LANG| does not support re-exporting. All desired entities must be 43863af6ab5fSopenharmony_ciimported explicitly from the modules that export them. 43873af6ab5fSopenharmony_ci 43883af6ab5fSopenharmony_ci|CB_BAD| 43893af6ab5fSopenharmony_ci~~~~~~~~ 43903af6ab5fSopenharmony_ci 43913af6ab5fSopenharmony_ci.. code-block:: typescript 43923af6ab5fSopenharmony_ci 43933af6ab5fSopenharmony_ci // module1 43943af6ab5fSopenharmony_ci export class MyClass { 43953af6ab5fSopenharmony_ci // ... 43963af6ab5fSopenharmony_ci } 43973af6ab5fSopenharmony_ci 43983af6ab5fSopenharmony_ci // module2 43993af6ab5fSopenharmony_ci export { MyClass } from "module1" 44003af6ab5fSopenharmony_ci 44013af6ab5fSopenharmony_ci // consumer module 44023af6ab5fSopenharmony_ci import { MyClass } from "module2" 44033af6ab5fSopenharmony_ci 44043af6ab5fSopenharmony_ci const myInstance = new MyClass() 44053af6ab5fSopenharmony_ci 44063af6ab5fSopenharmony_ci|CB_OK| 44073af6ab5fSopenharmony_ci~~~~~~~ 44083af6ab5fSopenharmony_ci 44093af6ab5fSopenharmony_ci.. code-block:: typescript 44103af6ab5fSopenharmony_ci 44113af6ab5fSopenharmony_ci // module1 44123af6ab5fSopenharmony_ci export class MyClass { 44133af6ab5fSopenharmony_ci // ... 44143af6ab5fSopenharmony_ci } 44153af6ab5fSopenharmony_ci 44163af6ab5fSopenharmony_ci // module2 44173af6ab5fSopenharmony_ci // some stuff 44183af6ab5fSopenharmony_ci 44193af6ab5fSopenharmony_ci // consumer module 44203af6ab5fSopenharmony_ci import MyClass from "module1" 44213af6ab5fSopenharmony_ci import * from "module2" 44223af6ab5fSopenharmony_ci 44233af6ab5fSopenharmony_ci const myInstance = new MyClass() 44243af6ab5fSopenharmony_ci 44253af6ab5fSopenharmony_ci|CB_SEE| 44263af6ab5fSopenharmony_ci~~~~~~~~ 44273af6ab5fSopenharmony_ci 44283af6ab5fSopenharmony_ci* :ref:`R124` 44293af6ab5fSopenharmony_ci* :ref:`R126` 44303af6ab5fSopenharmony_ci 44313af6ab5fSopenharmony_ci.. _R126: 44323af6ab5fSopenharmony_ci 44333af6ab5fSopenharmony_ci|CB_R| #126: ``export = ...`` assignment is not supported 44343af6ab5fSopenharmony_ci--------------------------------------------------------- 44353af6ab5fSopenharmony_ci 44363af6ab5fSopenharmony_ci|CB_RULE| 44373af6ab5fSopenharmony_ci~~~~~~~~~ 44383af6ab5fSopenharmony_ci 44393af6ab5fSopenharmony_ci|LANG| does not support ``export = ...`` syntax. 44403af6ab5fSopenharmony_ciUse regular ``export`` / ``import`` instead. 44413af6ab5fSopenharmony_ci 44423af6ab5fSopenharmony_ci|CB_BAD| 44433af6ab5fSopenharmony_ci~~~~~~~~ 44443af6ab5fSopenharmony_ci 44453af6ab5fSopenharmony_ci.. code-block:: typescript 44463af6ab5fSopenharmony_ci 44473af6ab5fSopenharmony_ci // module1 44483af6ab5fSopenharmony_ci export = Point 44493af6ab5fSopenharmony_ci 44503af6ab5fSopenharmony_ci class Point { 44513af6ab5fSopenharmony_ci constructor(x: number, y: number) {} 44523af6ab5fSopenharmony_ci static origin = new Point(0, 0) 44533af6ab5fSopenharmony_ci } 44543af6ab5fSopenharmony_ci 44553af6ab5fSopenharmony_ci // module2 44563af6ab5fSopenharmony_ci import Pt = require("module1") 44573af6ab5fSopenharmony_ci 44583af6ab5fSopenharmony_ci let p = Pt.origin 44593af6ab5fSopenharmony_ci 44603af6ab5fSopenharmony_ci|CB_OK| 44613af6ab5fSopenharmony_ci~~~~~~~ 44623af6ab5fSopenharmony_ci 44633af6ab5fSopenharmony_ci.. code-block:: typescript 44643af6ab5fSopenharmony_ci 44653af6ab5fSopenharmony_ci // module1 44663af6ab5fSopenharmony_ci export class Point { 44673af6ab5fSopenharmony_ci constructor(x: number, y: number) {} 44683af6ab5fSopenharmony_ci static origin = new Point(0, 0) 44693af6ab5fSopenharmony_ci } 44703af6ab5fSopenharmony_ci 44713af6ab5fSopenharmony_ci // module2 44723af6ab5fSopenharmony_ci import * as Pt from "module1" 44733af6ab5fSopenharmony_ci 44743af6ab5fSopenharmony_ci let p = Pt.origin 44753af6ab5fSopenharmony_ci 44763af6ab5fSopenharmony_ci|CB_SEE| 44773af6ab5fSopenharmony_ci~~~~~~~~ 44783af6ab5fSopenharmony_ci 44793af6ab5fSopenharmony_ci* :ref:`R124` 44803af6ab5fSopenharmony_ci* :ref:`R125` 44813af6ab5fSopenharmony_ci 44823af6ab5fSopenharmony_ci 44833af6ab5fSopenharmony_ci.. _R127: 44843af6ab5fSopenharmony_ci 44853af6ab5fSopenharmony_ci|CB_R| #127: Special export type declarations are not supported 44863af6ab5fSopenharmony_ci--------------------------------------------------------------- 44873af6ab5fSopenharmony_ci 44883af6ab5fSopenharmony_ci|CB_RULE| 44893af6ab5fSopenharmony_ci~~~~~~~~~ 44903af6ab5fSopenharmony_ci 44913af6ab5fSopenharmony_ci|LANG| does not have a special notation for exporting types. 44923af6ab5fSopenharmony_ciUse ordinary export instead. 44933af6ab5fSopenharmony_ci 44943af6ab5fSopenharmony_ci|CB_BAD| 44953af6ab5fSopenharmony_ci~~~~~~~~ 44963af6ab5fSopenharmony_ci 44973af6ab5fSopenharmony_ci.. code:: typescript 44983af6ab5fSopenharmony_ci 44993af6ab5fSopenharmony_ci class C {} 45003af6ab5fSopenharmony_ci export type { C } 45013af6ab5fSopenharmony_ci 45023af6ab5fSopenharmony_ci|CB_OK| 45033af6ab5fSopenharmony_ci~~~~~~~ 45043af6ab5fSopenharmony_ci 45053af6ab5fSopenharmony_ci.. code:: typescript 45063af6ab5fSopenharmony_ci 45073af6ab5fSopenharmony_ci export class C {} 45083af6ab5fSopenharmony_ci 4509