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