SAP / ui5-typescript

Tooling to enable TypeScript support in SAPUI5/OpenUI5 projects
https://sap.github.io/ui5-typescript
Apache License 2.0
201 stars 28 forks source link

tsc gives 'Duplicate identifier' error messages (@openui5/ts-types@1.90.5) #289

Open one-github opened 3 years ago

one-github commented 3 years ago

When running tsc on an empty JavaScript file it gives the following error messages:

$ ./node_modules/typescript/bin/tsc
node_modules/@openui5/ts-types/types/sap.m.d.ts:301:15 - error TS2300: Duplicate identifier 'MessageBox'.

301     namespace MessageBox {
                  ~~~~~~~~~~

node_modules/@openui5/ts-types/types/sap.m.d.ts:24179:15 - error TS2300: Duplicate identifier 'MessageBox'.

24179     interface MessageBox {
                    ~~~~~~~~~~

node_modules/@openui5/ts-types/types/sap.m.d.ts:24868:11 - error TS2300: Duplicate identifier 'MessageBox'.

24868     const MessageBox: MessageBox;
                ~~~~~~~~~~

node_modules/@openui5/ts-types/types/sap.ui.commons.d.ts:3401:17 - error TS2300: Duplicate identifier 'MessageBox'.

3401       namespace MessageBox {
                     ~~~~~~~~~~

node_modules/@openui5/ts-types/types/sap.ui.commons.d.ts:6401:17 - error TS2300: Duplicate identifier 'MessageBox'.

6401       interface MessageBox {
                     ~~~~~~~~~~

node_modules/@openui5/ts-types/types/sap.ui.commons.d.ts:6526:13 - error TS2300: Duplicate identifier 'MessageBox'.

6526       const MessageBox: MessageBox;
                 ~~~~~~~~~~

node_modules/@openui5/ts-types/types/sap.ui.core.d.ts:37617:19 - error TS2300: Duplicate identifier 'odata4analytics'.

37617         namespace odata4analytics {
                        ~~~~~~~~~~~~~~~

node_modules/@openui5/ts-types/types/sap.ui.core.d.ts:39118:19 - error TS2300: Duplicate identifier 'odata4analytics'.

39118         interface odata4analytics {
                        ~~~~~~~~~~~~~~~

node_modules/@openui5/ts-types/types/sap.ui.core.d.ts:39133:15 - error TS2300: Duplicate identifier 'odata4analytics'.

39133         const odata4analytics: odata4analytics;
                    ~~~~~~~~~~~~~~~

node_modules/@openui5/ts-types/types/sap.ui.core.d.ts:58425:15 - error TS2300: Duplicate identifier 'Device'.

58425     namespace Device {
                    ~~~~~~

node_modules/@openui5/ts-types/types/sap.ui.core.d.ts:59682:19 - error TS2300: Duplicate identifier 'dataTableUtils'.

59682         namespace dataTableUtils {
                        ~~~~~~~~~~~~~~

node_modules/@openui5/ts-types/types/sap.ui.core.d.ts:59750:19 - error TS2300: Duplicate identifier 'dataTableUtils'.

59750         interface dataTableUtils {
                        ~~~~~~~~~~~~~~

node_modules/@openui5/ts-types/types/sap.ui.core.d.ts:59826:15 - error TS2300: Duplicate identifier 'dataTableUtils'.

59826         const dataTableUtils: dataTableUtils;
                    ~~~~~~~~~~~~~~

node_modules/@openui5/ts-types/types/sap.ui.core.d.ts:63827:15 - error TS2300: Duplicate identifier 'Device'.

63827     interface Device {}
                    ~~~~~~

node_modules/@openui5/ts-types/types/sap.ui.core.d.ts:63828:11 - error TS2300: Duplicate identifier 'Device'.

63828     const Device: Device;
                ~~~~~~

Found 15 errors.
$ cat tsconfig.json
{
    "compilerOptions": {
        "incremental": true,
        "noImplicitAny": false,
        "noImplicitReturns": true,
        "noImplicitThis": true,
        "strictBindCallApply": true,
        "strictFunctionTypes": true,
        "strictPropertyInitialization": false,
        "strictNullChecks": false,
        "allowJs": true,
        "checkJs": true,
        "module": "ESNext",
        "target": "ES2020",
        "types": ["@openui5/ts-types", "@types/qunit", "@types/jquery"],
        "noEmit": true,
        "noFallthroughCasesInSwitch": true, 
        "allowUnreachableCode": false,
        "allowUnusedLabels": false,
        "lib": ["dom","es7"]
    },
    "include": [
        "./empty.js"
    ]
}
$ npm list
my_fiori@1.0.0 /Users/myuser/Documents/my_fiori
├── @openui5/ts-types@1.90.5
├─┬ @types/jquery@3.5.6
│ └── @types/sizzle@2.3.3
├── @types/qunit@2.11.2
└── typescript@4.3.5
akudev commented 2 years ago

Sorry for the delay (vacation time...). Our focus is on the "ts-types-esm" flavor of the type definitions right now, not the "ts-types" definitions which still define all the globals ("sap.m.Button" etc.) which we don't recommend to use anymore. Those "globals" definitions are mostly for code completion support in legacy projects. This doesn't mean we won't handle this issue report, but it is not a top priority right now. Thanks for the reminder, nevertheless. We have internally set up an ignorelist with these errors and put checks in place to prevent the introduction of new issues. So at least they shouldn't get more.

bd82 commented 2 years ago

Using skipLibChecks tsc compiler option may enable to you ignore all these issues at the consumer side

yishn commented 1 year ago

skipLibChecks: true does suppress the error messages, however calling e.g. sap.m.MessageBox.error() does not work because Typescript does not recognize error in MessageBox. Any updates on this? @akudev

DetachHead commented 1 year ago

these errors too:

node_modules/@sapui5/ts-types/types/sap.fe.navigation.d.ts:271:28 - error TS2702: 'JQuery' only refers to a type, but is being used as a namespace here.

271         parseNavigation(): JQuery.Promise<any, any, any>;
                               ~~~~~~

node_modules/@sapui5/ts-types/types/sap.fe.navigation.d.ts:338:12 - error TS2702: 'JQuery' only refers to a type, but is being used as a namespace here.

338         ): JQuery.Promise<any, any, any>;
               ~~~~~~

node_modules/@sapui5/ts-types/types/sap.fe.test.d.ts:3092:13 - error TS2417: Class static side 'typeof ListReport' incorrectly extends base class static side 'typeof TemplatePage'.
  Types of property 'actions' are incompatible.
    Type 'actions' is missing the following properties from type 'actions': onActionDialog, onConfirmationDialog, onCreateDialog, onDialog, and 3 more.

3092       class ListReport extends sap.fe.test.TemplatePage {
                 ~~~~~~~~~~

node_modules/@sapui5/ts-types/types/sap.fe.test.d.ts:3133:13 - error TS2417: Class static side 'typeof ObjectPage' incorrectly extends base class static side 'typeof TemplatePage'.
  Types of property 'actions' are incompatible.
    Type 'actions' is missing the following properties from type 'actions': onActionDialog, onConfirmationDialog, onCreateDialog, onDialog, and 3 more.

3133       class ObjectPage extends sap.fe.test.TemplatePage {
                 ~~~~~~~~~~
akudev commented 1 year ago

To not leave these recent comments unanswered: as stated above, the "ts-types" with globals are not in focus anymore. This doesn't mean they'll never get improved, but the more important thing for us is getting the ESM types to production quality, sorry.

DetachHead commented 1 year ago

fair enough, i use the esm types where i can but in this case i need the old global types for a script i'm injecting onto a page that has window.sap in it. more specifically, i'm making a playwright selector engine for ui5 - https://github.com/DetachHead/playwright-ui5/blob/0dc3c2db69dc6550ab173ba0de24bb976837cbf6/src/browser/main.ts#L28

if anybody knows of a way to do this with the esm types that would be nice

petermuessig commented 1 year ago

Hi @DetachHead ,

together with @akudev, we suggest the following and recommend the ESM type defs 😉 :

import type { registry } from 'sap/ui/core/Element'

// @ts-ignore
const ElementRegistry: registry = window.sap.ui.core.Element.registry

[...]

    const controls = ElementRegistry.filter((element) => {

There is one caveat, starting with the UI5 type definitions 1.115.0 we reworked the types to better match the runtime code and therefore it will look like this then:

import type UI5Element from 'sap/ui/core/Element'

// @ts-ignore
const ElementRegistry: typeof UI5Element.registry = window.sap.ui.core.Element.registry

Would this be something you can live with?

akudev commented 1 year ago

(or define sap.ui.core.Element locally as custom type which happens to have the same "registry" as Element - this avoids the @ts-ignore)

DetachHead commented 1 year ago

Would this be something you can live with?

i wanted to avoid this kind of boilerplate though but i guess it's not that big of a deal for my use case where i'm only using one thing from the sap namespace. thanks

DetachHead commented 9 months ago

@petermuessig i tried this on the latest version (1.120.1) but 'sap/ui/core/Element' doesn't seem to be exported anymore?

import type { registry } from 'sap/ui/core/Element'
Cannot find module 'sap/ui/core/Element' or its corresponding type declarations.
akudev commented 9 months ago

@DetachHead Umm... that's one of the most important modules in UI5, I'm pretty sure it is still declared. Make sure the types are loaded. image

DetachHead commented 9 months ago

oops i still was actually still using the global @sapui5/ts-types package, my bad