Jak określić dokładne pochodzenie typu?

0

Tak się złożyło że w mam w teście dwie zależności "mocha" oraz "typescript". Obie one precyzują typ Document.

Jak deklaruję zmienną, powiedzmy const value: Document, to IDE podpowiada mi że value może być zarówno typu Document z "mocha" jak i z "typescript". Są to inne typy, nie mają ze sobą nic wspólnego oprócz nazwy. Ja konkretnie chcę użyć Document jako typ z "mocha".

Jak sprecyzować dokładnie skąd ma być wzięty ten typ?

2

Nie możesz zaliasować tego importu?

import { Document as MochaDocument } from 'mocha';
0
Saalin napisał(a):

Nie możesz zaliasować tego importu?

import { Document as MochaDocument } from 'mocha';

A jak zaimportować typ Document z "typescript"?

0
Riddle napisał(a):

A jak zaimportować typ Document z "typescript"?

ekhm... no dosłownie:

import Document from 'typescript';

:)

No ale jak nie zaimportujesz typu z mocha to będzie użyty ten domyślny, czyż nie?
Możesz też użyć:

const value: globalThis.Document

Albo po prostu użyć typu zwracanego przez coś innego:

const value: ReturnType<typeof funkcjaZwracajacyDobryTyp>;

to ostatnie jest przydatne do setTimeout które potrafi zwrócić number lub NodeJS.Timeout w zależności gdzie użyjemy kodu a musimy użyć tego samego typu do clearTimeout.

0
obscurity napisał(a):
Riddle napisał(a):

A jak zaimportować typ Document z "typescript"?

ekhm... no dosłownie:

import Document from 'typescript';

No coś nie bardzo. Może coś robię źle?

tsconfig.json:

{
  "compilerOptions": {
    "lib": ["DOM"],
    "allowImportingTsExtensions": true
  }
}
TSError: ⨯ Unable to compile TypeScript:
render/unit/render.ts(8,9): error TS2305: Module '"typescript"' has no exported member 'Document'.

    at createTSError (C:\Users\riddle\WebstormProjects\4play.v2\test\node_modules\ts-node\src\index.ts:859:12)
    at reportTSError (C:\Users\riddle\WebstormProjects\4play.v2\test\node_modules\ts-node\src\index.ts:863:19)

screenshot-20231023174358.png

Zarówno import z "typescript" jak i "ts-node" mówi że nie ma Document. Jak odpalam kod i piszę typ Document, nigdzie go nie deklarując to działa normalnie, tylko problem jest taki że to jest implicit.

A ja chciałbym wskazać explicit skąd ten typ jest. Tylko właśnie problem jest taki że nie wiem skąd jest :D

0
Riddle napisał(a):

render/unit/render.ts(8,9): error TS2305: Module '"typescript"' has no exported member 'Document'.

No masz rację, to importuje typ ts jako Document i co prawda jakoś to się kompiluje ale robi co innego. Widzę że Document jest zdefiniowane w typescript/lib ale nie wyeksportowane.

Szczerze to co robisz nie jest standardową praktyką i nie za bardzo rozumiem co chcesz osiągnąć? Czemu po prostu nie możesz nie importować innych typów i w ten sposób zostaniesz ze standardowym? Kartkując internet wydaje się że globalThis jest rozwiązaniem na Twój "problem".
Możesz też zrobić własny plik jakiś dom.ts i reeksportować ten dokument

export interface Document extends globalThis.Document {}

wtedy możesz "zaimportować" go ze swojego pliku i uniknąć pisania globalThis za każdym razem.

0
obscurity napisał(a):

Szczerze to co robisz nie jest standardową praktyką i nie za bardzo rozumiem co chcesz osiągnąć? Czemu po prostu nie możesz nie importować innych typów i w ten sposób zostaniesz ze standardowym?

To nie jest tak że ja "coś robię".

Zapytałem jak zaimportować Document, i powiedziałeś że import Document from 'typescript'; - co się okazało później że się nie da, bo nie jest eksportowane.

0

Tak, mea culpa, tak na szybko napisałem w ramach testu i nawet się skompilowało i zadziałało (bez dodawania nawiasów) ale robi to całkiem co innego, dałem natomiast 3 inne działające rozwiązania

0
obscurity napisał(a):

Tak, mea culpa, tak na szybko napisałem w ramach testu i nawet się skompilowało i zadziałało (bez dodawania nawiasów) ale robi to całkiem co innego, dałem natomiast 3 inne działające rozwiązania

W sumie to dałeś jedno, bo "nie importować", to jest to co mam teraz w kodzie; a drugie to użyć globalThis, przy czym to też nie jestem do końca tego pewien, bo przecież inne moduły też mogą zadeklarować Document w globalnej przestrzeni, ? dobrze myslę?

A chciałbym to zaimportować, żeby wiedzieć skądś jakie typy się biorą, i żeby kod był samoopisowy. Jak buduję np graf, i widze typ Node to chciałbym wiedzieć czy on się wziął z TS, czy to jest mój typ czy się wziął z biblioteki jakiejs.

0
Riddle napisał(a):

W sumie to dałeś jedno, bo "nie importować", to jest to co mam teraz w kodzie; a drugie to użyć globalThis, przy czym to też nie jestem do końca tego pewien

Z tym to dałem nawet 4 rozwiązania:

  1. Nie importowanie innego dokumentu (normalne podejście)
  2. użycie globalThis.Document
  3. re-eksport typu Document z pliku który na pewno nie importuje innego dokumentu, wtedy masz pewność że używasz właściwego
  4. użycie ReturnType na czymś co zwraca Document

przecież inne moduły też mogą zadeklarować Document w globalnej przestrzeni, ? dobrze myslę?

Typescript się musi tłumaczyć na javascript. Jak ktoś nadpisze Document w globalnej przestrzeni javascript to jeśli go sobie wcześniej nie zapisałeś do innej zmiennej to żadna magia typescripta tego nie przywróci, możesz go sobie jedynie odzyskać z document.__proto__.__proto__.
A typescript nie pozwoli na redefinicję Document, jedynie na jego rozszerzanie. To by było mega dziwne gdyby jakiś moduł nadpisywał globalne typy.

0

Ale słaby ten typescript, żeby Document był implicitly imported.

Nawet nie mam "DOM" w "libs", więc czemu mi wsadził ten typ z niczego? Co to w ogóle za dziwna magia że używa się typu, który nie dość że jest domyślnie władowany w scope, to jeszcze nie jest nawet exportowany że nie można go explicitly zaimportować ;|

0
Riddle napisał(a):

Ale słaby ten typescript, żeby Document był implicitly imported.

Co to w ogóle za dziwna magia że używa się typu, który nie dość że jest domyślnie władowany w scope, to jeszcze nie jest nawet exportowany że nie można go explicitly zaimportować ;|

To w ogóle nie własność typescripta tylko javascript który ma domyślne "zaimportowane" typy w zależności od środowiska. Trochę inne dostępne typy będą w przeglądarce, inne w node.js.
W tsconfig.json masz lib a tam dom i w tym module masz te deklaracje które trafiają do globalnego kontekstu. Przykładowo React i inne frameworki deklarują te globalne typy samemu żeby dało się użyć w testach @types/react/global.d.ts bez używania libki dom. Tak to po prostu działa, javascript jest starszy niż moduły i namespace'y.

Nawet nie mam "DOM" w "libs", więc czemu mi wsadził ten typ z niczego?

Nie powinno go tam być, naciśnij F12 żeby zobaczyć skąd przyszedł, pewnie tak jak pisałem wyżej dostarczył go framework którego używasz

0
obscurity napisał(a):
Riddle napisał(a):

Ale słaby ten typescript, żeby Document był implicitly imported.

Co to w ogóle za dziwna magia że używa się typu, który nie dość że jest domyślnie władowany w scope, to jeszcze nie jest nawet exportowany że nie można go explicitly zaimportować ;|

To w ogóle nie własność typescripta tylko javascript który ma domyślne "zaimportowane" typy w zależności od środowiska. Trochę inne dostępne typy będą w przeglądarce, inne w node.js.
W tsconfig.json masz lib a tam dom i w tym module masz te deklaracje które trafiają do globalnego kontekstu. Przykładowo React i inne frameworki deklarują te globalne typy samemu żeby dało się użyć w testach @types/react/global.d.ts bez używania libki dom. Tak to po prostu działa, javascript jest starszy niż moduły i namespace'y.

Ale ja nie mam "dom" w "lib", więc nie wiem czemu ten typ ejst dodany tak czy tak.

obscurity napisał(a):

Nie powinno go tam być, naciśnij F12 żeby zobaczyć skąd przyszedł, pewnie tak jak pisałem wyżej dostarczył go framework którego używasz

Jakie F12, o czym Ty gadasz? Przecież ja tego nie uruchamiam w przeglądarce, tylko normalnie na localu, mam typescript, mocha do testów i nic więcej. Nie mam "dom" w "lib", a i tak typ Document jest wsadzony.

0
obscurity napisał(a):
Riddle napisał(a):

Ale słaby ten typescript, żeby Document był implicitly imported.

Co to w ogóle za dziwna magia że używa się typu, który nie dość że jest domyślnie władowany w scope, to jeszcze nie jest nawet exportowany że nie można go explicitly zaimportować ;|

To w ogóle nie własność typescripta tylko javascript który ma domyślne "zaimportowane" typy w zależności od środowiska.

No tak, i JavaScript w Node nie ma document, więc tego typu powinno nie być, zwłaszcza że nie mam "dom" w "lib".

obscurity napisał(a):

F12 w visual studio code, przejdzie do definicji typu

Pokazuje interface Document extends Node, DocumentOrShadowRoot, FontFaceSource, GlobalEventHandlers, NonElementParentNode, ParentNode, XPathEvaluatorBase z lib.dom.d.ts.

0

a lib w tsconfig masz puste czy w ogóle brak bo to dwie różne rzeczy? Jeśli nie masz w ogóle lib to dołączane są standardowe definicje, w tym dom, możesz nie importować niczego dodając do tsconfig

"noLib": true, 

ale wtedy nie będziesz miał nawet najbardziej podstawowych typów typu Array

0
obscurity napisał(a):

a lib w tsconfig masz puste czy w ogóle brak bo to dwie różne rzeczy? Jeśli nie masz w ogóle lib to dołączane są standardowe definicje, w tym dom, możesz nie importować niczego dodając do tsconfig

"noLib": true, 

ale wtedy nie będziesz miał nawet najbardziej podstawowych typów typu Array

No to powiem, super ten typescript.

A jak mieć typ array, ale nie mieć "dom"? Innymi słowy, jak mieć typy które daje node?

1

dając puste lib albo tylko wersję standardu

"lib": ["ES2023"],
0
obscurity napisał(a):

dając puste lib albo tylko wersję standardu

"lib": ["ES2023"],

Jak to dałem, to typ Document nadal jest zdefiniowany niejawnie.

Faktycznie jak dam "noLib": true, to Document już nie jest dodawany niejawnie, ale tak jak mówiłes, Array też nie ma.

0
Riddle napisał(a):

Jak to dałem, to typ Document nadal jest zdefiniowany niejawnie.

To ciekawe, "u mnie działa".
Może mocha dodaje jakoś ten typ niejawnie? Pokaż całe tsconfig

0
obscurity napisał(a):
Riddle napisał(a):

Jak to dałem, to typ Document nadal jest zdefiniowany niejawnie.

To ciekawe, "u mnie działa".
Może mocha dodaje jakoś ten typ niejawnie? Pokaż całe tsconfig

tsconfig.json

{
  "compilerOptions": {
    "lib": ["ES2023"],
    "allowImportingTsExtensions": true
  }
}

Używam też ts-node/register żeby odpalić testy w TS.

0

wygląda to na kolejną ułomność intellij. A kompiluje się normalnie i działa ten typ czy tylko IDE tak pokazuje?

0
obscurity napisał(a):

wygląda to na kolejną ułomność intellij. A kompiluje się normalnie i działa ten typ czy tylko IDE tak pokazuje?

Kolejny nietrafiony wniosek, bo jak odpalam z command line'a to jest ten sam efekt.

Jeśli przez "kompiluje się i działa normalnie ten typ" masz na myśli "typescript niejawnie dodaje typ z domu, mimo że go nikt o to nie prosił", to tak.

Dobra, dzięki @obscurity za pomoc na razie. Idę programować dalej (z niejawnym Document w scopie jako prezent od typescripta).

0

No nie jestem w stanie "pomóc", w nowym projekcie działa to normalnie, prosty wniosek że masz coś zrąbane w swoim. Programuj, może dojdziesz do jakichś realnych problemów

0
obscurity napisał(a):

No nie jestem w stanie "pomóc", w nowym projekcie działa to normalnie, prosty wniosek że masz coś zrąbane w swoim. Programuj, może dojdziesz do jakichś realnych problemów

yarn add mocha
yarn add typescript
yarn add ts-node

tyle zrobiłem. tsconfig.json widziałeś. To nie jest "normalny" projekt?

1 użytkowników online, w tym zalogowanych: 0, gości: 1