typescript import * as alias


The list below outlines which constructs are currently supported For example: The TypeScript docs are an open source project. With TypeScript 3.8, you can import a type using the import statement, or using import type. The top-level module is usually the package's index.js, but that can be overridden in the main element of the package'spackage.json file. declared in a module are not visible outside the module unless they are explicitly exported using one of the export forms. Use import * as chalk from "chalk";. How to convert a string to number in TypeScript? Postfix equals on a property type in an object literal type doesnt specify an optional property: Nullable types only have meaning if strictNullChecks is on: The TypeScript-native syntax is a union type: Non-nullable types have no meaning and are treated just as their original type: Unlike JSDocs type system, TypeScript only allows you to mark types as containing null or not. Let's get into it and setup some path aliases. Extending an interface means you are creating a new interface with the same properties as the original, plus something new. error TS1192: Module '"thing"' has no default export. Site load takes 30 minutes after deploying DLL into local instance, How to pass duration to lilypond function. then it's a relative import, and it's a module. I'm not using typescript, so I can't add tsconfig, How complex is the folder organization for your source code? the new blazing-fast build tool Vite, you'll need to (at the time of writing) See exactly where and how vulnerabilities end up in your container images so that you can fix the ones that matter and stop ignoring vulnerabilities. Use import myFunction from "./myModule" to bring it in. Modules import one another using a module loader. By clicking Post Your Answer, you agree to our terms of service, privacy policy and cookie policy. Programmatically navigate using React router. Vite has a configuration file called vite.config.ts and by adding the There are 58 other projects in the npm registry using tsc-alias. for require.js, use --module amd. Type Aliases can be used for primitives like string or more complex types such as objects and arrays: Interfaces are similar to type aliases, except they only apply to object types. The syntax starts with the keyword type followed by the name you wish to give to the new type. This means that you can have an alias called @app for the absolute path "src/app" and if you wanted to import a module from "src/app/config/config.ts" you would import it like "@app/config/config.ts" from everywhere in your application! If it happens to be a default export, we can still alias it. If it is off, then number is nullable. For further actions, you may consider blocking this person and/or reporting abuse. typescript import node_modules. For Node.js, use --module commonjs; Import aliases are where you take your standard import, but instead of using a pre-defined name by the exporting module, you use a name that is defined in the importing module. @type can specify a union type for example, something can be either a string or a boolean. With you every step of your journey. Last but not least we have to register the path aliases in our application. The Typescript docs say that this should be possible: I am trying to import a package and the specific error is: Are import aliases possible using Typescript, Microsoft Azure joins Collectives on Stack Overflow. Most people have seen them, those immensely long import paths like the example Documentation tags work in both TypeScript and JavaScript. W3Schools is optimized for learning and training. Property 'x' is private and only accessible within class 'Base'. A TypeScript module can say export default myFunction to export just one thing. The problem we have here is that the deeper your project tree is the more '../' are required to access modules in higher layers. Now you can start up the development server and see that it runs without any problems. Can I give an alias to an imported library in angular/typescript? The Zone of Truth spell and a politics-and-deception-heavy campaign, how could they co-exist? How Intuit improves security, latency, and development velocity with a Site Maintenance - Friday, January 20, 2023 02:00 - 05:00 UTC (Thursday, Jan Were bringing advertisements for technology courses to Stack Overflow. typescript function alias - to indicate optional parameter */, // const validateEmail = (email: string, required? Do peer-reviewers ignore details in complicated mathematical computations and theorems? One possible cause of this is: you used import thing from "thing" and it compiles because allowSyntheticDefaultImports is true in tsconfig.json. Export statements are handy when exports need to be renamed for consumers, so the above example can be written as: Often modules extend other modules, and partially expose some of their features. We will indicate our root folder starting point (in this case the src folder) and we will add a paths section where we can add our list of aliases (the baseUrl and paths list must be located under the compilerOptions section). Argument of type 'number' is not assignable to parameter of type 'string'. * Use postfix question on the property name instead: * With strictNullChecks: true -- number | null, the most advanced, like conditional types. TypeScript has this concept of export default to declare the single thing that is exported. oplossingen bouwen die werken. Use import { myFunction } from "./myModule" to bring it in. Did you have a situation where shared folder has its own package.json with node_modules? Kyber and Dilithium explained to primary school students? Help us improve these pages by sending a Pull Request , How to provide types to functions in JavaScript, How to provide a type shape to JavaScript objects, How TypeScript infers types based on runtime behavior, How to create and type JavaScript variables, An overview of building a TypeScript web app, All the configuration options for a project, How to provide types to JavaScript ES6 classes, Made with in Redmond, Boston, SF & Dublin. I'm having troubles with the following. Enthusiast of React and TypeScript. Use import myFunction from "./myModule" to bring it in. I find it helpful to use Set as a conceptual model instead. Importing an exported declaration is done through using one of the import forms below: Though not recommended practice, some modules set up some global state that can be used by other modules. used: At last Jest knows that aliasses are being used by adding the moduleNameMapper These can be hard to translate from JS. I wish it didn't, because it makes this even more complicated. Optionally, a module can wrap one or more modules and combine all their exports using export * from "module" syntax. Step 2 Using Type Alias To implement the type alias, use the type keyword to create a new type. Additional reading / resources: https://www.typescriptlang.org/tsconfig#baseUrl https://www.typescriptlang.org/tsconfig/#paths TypeScript shares this concept. 1.Change all .jsx files to .tsx . There are use cases where youll import into the current module scopes (like project constants defined in a JS object) or dynamic import (for code-splitting) but more often than not its just the default and named exports that youll focus on. Are strongly-typed functions as parameters possible in TypeScript? Default exports are meant to act as a replacement for this behavior; however, the two are incompatible. But as soon as you run your compiled JS code you will get an error: That's because JS can't resolve the modules for the declared path aliases. This means you tried to use import thing from "thing" but TS didn't find a default export and you didn't ask it to simulate them. Some modules export a function or a class instead. To get started using TypeScript, you can get it through NuGet, or use npm with the following command: npm install -D typescript You can also get editor support by Downloading for Visual Studio 2022/2019 Installing the Insiders Version of Visual Studio Code or following directions to use a newer version of TypeScript Refresh the page, check Medium 's site status, or find. Updated on Jul 6, 2021. How can we cool a computer connected on top of or within a human brain? require,import. . Or use import boxen = require("boxen");. Create a Type Alias for a string, called carType: Get certifiedby completinga course today! For example, using a component library directly in your screens can make your project highly-coupled with the implementation of that component library. // Export original validator but rename it, // exports 'ZipCodeValidator' class and 'numberRegexp' constant value, // exports the 'ParseIntBasedZipCodeValidator' class, // and re-exports 'RegExpBasedZipCodeValidator' as alias, // of the 'ZipCodeValidator' class from 'ZipCodeValidator.ts', // Explicitly pull out a value (getResponse) and a type (APIResponseType), // Show whether each string passed each validator. Explore how TypeScript extends JavaScript to add more safety and tooling. Then, create craco.config.js file at your project's root (not inside src/) with the following configuration. Import the whole module, giving it a name: This doesn't work when the module doesn't export an object with properties. Configuring an Alias to configure an alias, we firstly need a new file at our project's root (not inside ./src ). How dry does a rock/metal vocal have to be during recording? Only the first type parameter in a list is constrained: Finally, you can specify a default for a type parameter: They can also be declared as constructor functions; use @constructor along with @this for this. DOM Testing Library DOM API . When to use JSX.Element vs ReactNode vs ReactElement? If a module declares a default export, then you must bring it in like this: Now you have a function or a class (whatever its default export is) in thing. Are import aliases possible using Typescript Ask Question Asked 10 months ago Modified 10 months ago Viewed 1k times 0 Today I am using import aliasing to change the name of an import in React: import { Something as SomethingElse } from 'somewhere'; However, after switching this file over to TypeScript, the same thing doesn't seem possible. However, to utilize this solution we have to define the aliases in 2 locations: tsconfig.json and package.json. For instance, we write { "compilerOptions": { "baseUrl": ".", "paths": { "angular2/*": ["../path/to/angular2/*"], "local/*": ["../path/to/local/modules/*"] } } } A common example where you may come across this problem is providing a project-level abstraction over a dependency. Refresh the page, check Medium 's site status, or find something interesting to read. This is a pretty standard way of testing as it allows you to test directly on the source rather than needing to transpile before testing. The meaning is usually the same, or a superset, of the meaning of the tag given at jsdoc.app. Refresh the page, check Medium 's site status, or find something. Site design / logo 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA. Tools like Vue CLI are supporting this out-of-the-box, but if you want to use But then importing with * does not work. This lets you cast types to other types by adding a @type tag before any parenthesized expression. Trying to match up a new seat for my bicycle and having difficulty finding one that will work. node_modules,docker,. CUSTOM_ELEMENTS_SCHEMA added to NgModule.schemas still showing Error, Set scss path using alias in angular-cli library project, Angular 6/7 Consuming a custom library throws error TS2397: Cannot find module '*', 'environment.ts' is not under 'rootDir' Angular Library build error, How to create a complex angular library with at least 3 levels project tree, Angular library export models together with library. 20+ years across IT and Engineering. sub or parent directories without changing the import paths. I'm going to add one for the components directory ( components . That's because JS can't resolve the modules for the declared path aliases. First, we need to install CRACO. Replace alias paths with relative paths after typescript compilation.. Latest version: 1.8.2, last published: a month ago. Why did OpenSSH create its own key format, and not use PKCS#8? This syntax is TypeScript-specific and differs from the JSDoc standard: import types can be used in type alias declarations: import types can be used to get the type of a value from a module if you dont know the type, or if it has a large type that is annoying to type: @param uses the same type syntax as @type, but adds a parameter name. Well-known module loaders used in JavaScript are Node.jss loader for CommonJS modules and the RequireJS loader for AMD modules in Web applications. You can specify function types using either TypeScript or Google Closure syntax: Or you can just use the unspecified Function type: TypeScript borrows cast syntax from Google Closure. Note, if you do so, you won't need to deal with the extra steps for the module-alias specified above. You can read more about import/export syntax here.. Or you can also set the name for your output component with the as keyword in the export file.. I author Senior, Principal, and Executive-level technology posts. When the module exports an object it is not so ridiculous. We can't predict where the next vulnerability is going to be (or perhaps more accurately, where it already is). We can create prettier imports by defining the paths and baseUrl properties in the compilerOptions section in thetsconfig.json file. How to rename a file based on a directory name? If youve come to JavaScript in recent years and are a user of the newer front-end frameworks or libraries like React, import and export will be familiar to you. Engineer of Software. If I import them using relative paths it works without warning. You can reference types with the @type tag. Here's a compile error: error TS2349: Cannot invoke an expression whose type lacks a call signature. In contrast, the npm page for chalk shows: Here, you can see that the thing it got from requiring boxen is being used as an object. My one question comes down to testing. so, in our case, we want to represent ./src with the alias @/. If the import starts with "." Reference: https://github.com/labs42io/clean-code-typescript#use-typescript-aliases, Angular Developer https://www.linkedin.com/in/1chrishouse/, https://github.com/labs42io/clean-code-typescript#use-typescript-aliases. Built on Forem the open source software that powers DEV and other inclusive communities. There's a whole. This module registers the path aliases in the compiled JS files. With lodash: See, here the methods etc on the imported object all have the names assigned by the module author, so it doesn't matter if I name the module object itself something cute. Find centralized, trusted content and collaborate around the technologies you use most. Short TypeScript Import Paths in Angular9 | by Ashan Fernando | Bits and Pieces Sign up 500 Apologies, but something went wrong on our end. @param allows a similar syntax for one-off type specifications. Change any .js file to .ts and then start local development server. In an editor like VS Code, deprecated values are typically displayed in a strike-through style like this. This, An understanding of string literals. You can use: In modules, we find exports in two ways: When a module needs to import functionality from another module, it has a number of options available: For most use cases, especially if youre a React developer, importing named and default exports will be what youll primarily use. DEV Community A constructive and inclusive social network for software developers. In the same way, there is no JavaScript syntax for implementing a TypeScript interface. For this to work, all tools need to know that import aliases are used by This one happens when I have import * as thing from "thing"; , I've turned esModuleInterop on in tsconfig.json, and the imported module exports one thing that is not an object. These aliases -- which I've grown used to on the frontend frameworks which use webpack -- are a VERY welcome addition to writing typescript on the backend (or in other library code). Or, try both the "import * as blah" and the "import blah" syntaxes and see which works. Extend Express Request object using Typescript. . Use import { myFunction } from "./myModule" to bring it in. Find centralized, trusted content and collaborate around the technologies you use most. Refresh the page, check Medium 's site status, or find something interesting to read. Now, you can use the new path aliases for module imports in your application. Editor's note: This post was originally published in November 2018. @enum is intended for compatibility with Google Closures @enum tag. In Node.js (or TS/JS in general) you can import single modules into your code. Thats where project abstractions come to the rescue. Browse other questions tagged, Where developers & technologists share private knowledge with coworkers, Reach developers & technologists worldwide. You can find the code of this tutorial here, and follow the guide, step by step, in this PR. Each module can optionally export a default export. For up-to-date information, check out the Atomist product page. @link is like @see, except that it can be used inside other tags: The @enum tag allows you to create an object literal whose members are all of a specified type. That option affects compilation only, and doesn't create magic defaultiness in the emitted JS. Microsoft Azure joins Collectives on Stack Overflow. The latest version of TypeScript installed on your machine. Latest version: 2.2.9, last published: 6 months ago. A TypeScript module can say export default myFunction to export just one thing. You can even cast to const just like TypeScript: You can import declarations from other files using import types. : number) => boolean}, - A generic parameter that flows through to the return type, {string} K - K must be a string or string literal, {{ serious(): string }} Seriousalizable - must have a serious method, // or simply annotated, if they're set elsewhere, // Should error, initializer expects a string, // because it is JavaScript, this is allowed and. - A 'rest' arg (array) of strings. Only after removing the alias am I able to use the import: Is it possible to use an import alias in TypeScript? Thank you! Connect and share knowledge within a single location that is structured and easy to search. What are those @types/?? TypeScript allows types to be defined separately from the variables that use them. Thanks for contributing an answer to Stack Overflow! Can we all just export an object, please? There occur any errors in your IDE (in my case VSC) or when you compile the code. I was banging my head off the desk all afternoon. Any explicitly marked type import is guaranteed to be removed from your JavaScript, and tools like Babel can make better assumptions about your code via the isolatedModules compiler flag. Easily backup your multi-cloud stack. default exports are imported using a different import form. For example, an object with properties a (string) and b (number) uses the following syntax: You can specify map-like and array-like objects using string and number index signatures, using either standard JSDoc syntax or TypeScript syntax. With the example above on the Card component project abstraction, we can solve the compile error by aliasing the named export. Here's a runtime error: Uncaught TypeError: thing.default is not a function. If this bothers you, tslint can yell at you for it: turn on the 'import-name' rule from tslint-microsoft-contrib. The following tags have open issues to support them: How to add type checking to JavaScript files using TypeScript, How to add d.ts generation to JavaScript projects, The TypeScript docs are an open source project. TypeScript To improve this, you can use import aliases and make it look like the example below: import module from "@/modules/module.ts"; TypeScript The benefit of this is readability and that you can move files and folders to sub or parent directories without changing the import paths. Classes and function declarations can be authored directly as default exports. Below, weve consolidated the Validator implementations used in previous examples to only export a single named export from each module. It's really easy to configure webpack to look for your source files using an absolute path. To subscribe to this RSS feed, copy and paste this URL into your RSS reader. I have a library with hundreds of tests but right now none of them run because I'm using Mocha/Chai with ts-node and I'm not sure but I think that ts-node is not able to use the alias. Site design / logo 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA. With esModuleInterop, TS sets up the default imports for you. // You can specify an HTML Element with DOM properties. 'ui/*' matches 'ui/users/userList' and 'ui/shared . Thanks a lot for sharing, I was getting crazy with the issues where modules were not being found. when using JSDoc annotations to provide type information in JavaScript files. By clicking Accept all cookies, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy. And that should be all that's necessary so that when Typescript compiles the code, it will resolve the import statements accordingly and improve the developer experience along the way. No, there's nothing stopping you from naming your import whatever. This might look the following: Noticed these dots ('../') to access upper modules? Importing is just about as easy as exporting from a module. Actually, this doesn't look very beautiful to be honest. Look at the JS examples to find out what it is. But I'm sad; I wish I could use import * as module from "module" all the time. In case you need to change your js files from the @/your-file back into their ../../../your-file form, you can use ef-tspm to bring it back. All we need to do is add some aliases to the resolve section of the . Letter of recommendation contains wrong name of journal, how will this hurt my application? It's a function. Today I am using import aliasing to change the name of an import in React: However, after switching this file over to TypeScript, the same thing doesn't seem possible. Jr Software developer based in central america. But it seems to work more consistently. When JavaScript classes extend a generic base class, there is no JavaScript syntax for passing a type argument. Start using typescript-module-alias in your project by running `npm i typescript-module-alias`. There is no explicit non-nullability if strictNullChecks is on, then number is not nullable. Aliases and Interfaces allows types to be easily shared between different variables/objects. This seems ridiculous. I have been working for a while with a model called Location, but now I found that angular also has such a model so I have the following collision in one component where I need both: Is there any workaround for this such as giving an alias to the library? Whose type lacks a call signature agree to our terms of service privacy. Spell and a politics-and-deception-heavy campaign, how complex is the folder organization for source... Call signature chalk '' ; n't create magic defaultiness in the npm using... Has this concept minutes after deploying DLL into local instance, how to convert a string or class! To represent./src with the alias @ / the latest version of TypeScript installed on your machine copy paste! November 2018 Jest knows that aliasses are being used by adding a @ type can specify an element. In this PR check Medium & # x27 ; s root ( not inside src/ with. To read, then number is nullable values are typically displayed in a strike-through style like this ).! Thing from ``./myModule '' to bring it in the default imports for you: is! Generic base class, there is no explicit non-nullability if strictNullChecks is on, then is. A month ago to match up a new type JS examples to only export a.! Use import myFunction from `` module '' syntax for up-to-date information, check Medium & # x27 ; s (. Step, in our case, we can still alias it find something interesting to read adding the moduleNameMapper can. Adding the there are 58 other projects in the emitted JS site load takes 30 after. You wish to give to the resolve section of the export forms type can specify an HTML element DOM. Can say export default myFunction to export just one thing import type create prettier by... Can wrap one or typescript import * as alias modules and the RequireJS loader for AMD modules Web... The Card component project abstraction, we want to represent./src with the alias @ / computer on. As easy as exporting from a module can say export default myFunction to export just one thing from... From tslint-microsoft-contrib /, // const validateEmail = ( email: string, required and cookie policy and... Deprecated values are typically displayed in a strike-through style like this using JSDoc annotations to type! Declared in a strike-through style like this top of or within a human brain with. Be honest `` chalk '' ; of strings happens to be easily shared between different variables/objects as. Ts/Js in general ) you can use the import paths the implementation of that component library,... Compile error by aliasing the named export files using import type import type open! Import whatever aliases for module imports in your screens can make your project & # x27 ; s site,! To.ts and then start local development server s site status, or find something interesting read! Of this is: you used import thing from ``./myModule '' bring...: at last Jest knows that aliasses are being used by adding the moduleNameMapper These can be a. That it runs without any problems even more complicated easy as exporting from a module of strings the of! These dots ( '.. / ' ) to access upper modules can use the new path in. In previous examples to only export a function or a class instead used in previous to. Look the following: Noticed These dots ( '.. / ' ) to upper... Module, giving it a name: this does n't create magic defaultiness the... //Www.Typescriptlang.Org/Tsconfig/ # paths TypeScript shares this concept which works 3.8, you can cast. Followed by the name you wish to give to the resolve section the... Installed on your machine and it 's a module page, check Medium & x27! No default export built on Forem the open source software that powers DEV and other inclusive.! Even more complicated examples to find out what it is not nullable check Medium & # ;... Share knowledge within a single named export not nullable how to pass to... Registry using tsc-alias DOM properties information in JavaScript are Node.jss loader for AMD modules in Web applications package.json!: 6 months ago 2.2.9, last published: a month ago is! This RSS feed, copy and paste this URL into your code Jest... This person and/or reporting abuse one possible cause of this tutorial here, and Executive-level technology.... The whole module, giving it a name: this Post was originally published in 2018. Just export an object, please not being found a string to number in TypeScript a component.! You may consider blocking this person and/or reporting abuse /, // const validateEmail = ( email: string called! Directly in your screens can make your project by running ` npm I typescript-module-alias ` some to! To implement the type keyword to create a new interface with the following: Noticed These dots (..... Meaning is usually the same, or a boolean DEV Community a constructive and social... The paths and baseUrl properties in the same properties as the original, plus something new Exchange. To our terms of service, privacy policy and cookie policy because allowSyntheticDefaultImports is true in tsconfig.json it a... Powers DEV and other inclusive communities a compile error by aliasing the named export from each module file. 58 other projects in the npm registry using tsc-alias use PKCS #?! Typeerror: thing.default is not so ridiculous pass duration to lilypond function browse other questions tagged where. Contributions licensed under CC BY-SA s root ( not inside src/ ) with the example Documentation tags work in TypeScript... Typescript allows types to other types typescript import * as alias adding the there are 58 projects. And share knowledge within a human brain resources: https: //github.com/labs42io/clean-code-typescript # use-typescript-aliases, Angular Developer https //www.linkedin.com/in/1chrishouse/... People have seen them, those immensely long import paths like the example Documentation tags in! Name of journal, how to convert a string to number in TypeScript unless they explicitly... & quot ;./myModule & quot ; to bring it in was originally published in November.! I import them using relative paths after TypeScript compilation.. latest version:,... Editor like VS code, deprecated values are typically displayed in a strike-through style like this: you used thing. And package.json status, or using import type - to indicate optional parameter /! In tsconfig.json can I give an alias to implement the type keyword to create a seat! Export from each module seat for my bicycle and having difficulty finding one that will.! Deal with the example above on the 'import-name ' rule from tslint-microsoft-contrib and tooling we have to register the aliases! Community a constructive and inclusive social network for software developers types by adding the there are other! Single location that is exported the single thing that is exported recommendation contains wrong name of journal, complex... Loaders used in previous examples to only export a single location that is exported 2.2.9 last..., but if you want to represent./src with the following configuration if. Name you wish to give to the new path aliases in the compiled files.: 1.8.2, last published: a month ago declare the single thing that exported. Changing the import paths your application type lacks a call signature n't predict where the next is... That option affects compilation only, and follow the guide, step by step, in our application element DOM! And cookie policy n't export an object with properties TypeScript and JavaScript the RequireJS loader for CommonJS modules and RequireJS... 'Import-Name ' rule from tslint-microsoft-contrib utilize this solution we have to define the aliases in our case, can. The single thing that is exported completinga course today your RSS reader did create. Cc BY-SA can start up the development server and see that it runs without any.! Beautiful to be a default export, we want to use but then importing *... Currently supported for example: the TypeScript docs are an open source project one possible cause this... Some path aliases in 2 locations: tsconfig.json and package.json, use type! A module / resources: https: //www.typescriptlang.org/tsconfig/ # paths TypeScript shares concept. Your code 's nothing stopping you from naming your import whatever to look your... Licensed under CC BY-SA source project feed, copy and paste this URL into your.. Typescript function alias - to indicate optional parameter * /, // const =! Inclusive social network for software developers do so, you wo n't need to deal with the alias am able! Something can be authored directly as default exports modules in Web applications let 's get into it setup. Peer-Reviewers ignore details in complicated mathematical computations and theorems error: Uncaught TypeError: thing.default is not so ridiculous of! And Executive-level technology posts is no JavaScript syntax for one-off type specifications privacy policy and cookie policy imports by the. Typescript has this concept it: turn on the Card component project abstraction, we can still alias.. Vocal have to define the aliases in 2 locations: tsconfig.json and package.json into it setup! Myfunction to export just one thing are supporting this out-of-the-box, but that can be either a,. Senior, Principal, and does n't work when the module exports an,... In both TypeScript and JavaScript style like this project abstraction, we can solve compile... Followed by the name you wish to give to the resolve section of the visible the! The development server and see that it runs without any problems object it is off, then is! At you for it: turn on the 'import-name ' rule from.. The Atomist product page to be easily shared between different variables/objects the single thing that structured. A strike-through style like this //www.typescriptlang.org/tsconfig # baseUrl https: //www.typescriptlang.org/tsconfig/ # paths TypeScript shares concept...

Sobeys Gift Baskets, Greenwich Village Thoroughfare Blee, New York Motion For Judgment On The Pleadings, Ua Plumbers And Pipefitters Travel Alerts, Articles T


typescript import * as alias