microsoft / microsoft/TypeScript

"types" field in package.json pointing to a `.ts` file in node_modules results in the file being compiled and type checked

Open
#35,744 7 comments 5 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Awaiting More Feedback Suggestion
Dominant language
Go
Stars
111k
Forks
14.3k
Avg merge
2d 4h
Merged PRs (30d)
132

Description

Continuing from https://github.com/Microsoft/TypeScript/issues/22228

cc @evil-shrike

I have this issue.

@mhegazy said

the lib has either "types": "index.ts" or a .ts file at its root. which is wrong. a library should not expose its sources, only its declarations.

But features like inferred return types (f.e. when making class-factory mixins) are not compilable to declaration files, resulting in errors like

error TS4025: Exported variable 'html' has or is using private name 'htmlBind'.
error TS4031: Public property '_currentArea' of exported class has or is using private name 'AreaInternal'.
error TS4055: Return type of public method from exported class has or is using private name 'PartHelper'.
error TS4073: Parameter 'partHelper' of public method from exported class has or is using private name 'PartHelper'.
error TS4078: Parameter 'options' of exported function has or is using private name 'ExtendOptions'.

A .d.ts does not have expressions.. it represents the shape of the API.

Not entirely true.

As far as I know, the only way to use features (that declaration files don't support) in downstream projects is to get types directly from .ts source files. This makes the need to point types to .ts source files a valid use case.


This is what I think should happen:

If "types" points to a .ts file, and "main" points to a .js file, then the compiler should use the .ts file only for type definitions and not compile or type-check the code.

"main" can serve as a guide to telling the compiler whether it should compile sources, or read js files. "types" should be for... specifying the source of types.

Unless I missed it, there's no other way to include types for features that aren't representable in declaration files.

Why is it that declaration features don't match source features? It seems that an important goal should be for declaration features to always have the capability of matching source features.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reproducing the package.json setup described here, with types pointing to a .ts file and main pointing to a .js file; review the discussion in issue #22228 for context. Done means the compiler uses the .ts entry for type information without compiling or type-checking its implementation, while preserving the requested downstream typing behavior.

Written by the indexing model from the issue text.

Assessment

Tech stack
javascript, typescript
Domain
compilers
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.