Hone logo
Hone
Problems

Conditional Exports in TypeScript

Conditional exports allow you to selectively export modules or functions based on certain conditions, providing flexibility and adaptability in your TypeScript projects. This is particularly useful for targeting different environments (e.g., browser vs. Node.js), supporting different feature sets, or creating modular codebases where certain components are only needed in specific scenarios. This challenge will test your understanding of TypeScript's conditional types and how to apply them to control what is exported from a module.

Problem Description

You are tasked with creating a TypeScript module that conditionally exports a function based on the value of a FEATURE_FLAG constant. The FEATURE_FLAG is a boolean value that determines whether the advancedFeature function should be exported or not. If FEATURE_FLAG is true, the advancedFeature function should be exported. If FEATURE_FLAG is false, the advancedFeature function should not be exported, and attempting to import it should result in a compile-time error.

Key Requirements:

  • Define a FEATURE_FLAG constant as a boolean.
  • Create a function named advancedFeature that performs some action (e.g., logs a message).
  • Implement conditional exports using TypeScript's module export system.
  • Ensure that advancedFeature is only exported when FEATURE_FLAG is true.
  • The module should be structured in a way that allows for easy testing of both export and non-export scenarios.

Expected Behavior:

  • When FEATURE_FLAG is true, importing and calling advancedFeature from another module should work as expected.
  • When FEATURE_FLAG is false, attempting to import advancedFeature from another module should result in a TypeScript compilation error, indicating that the symbol is not found.

Edge Cases to Consider:

  • Ensure the conditional export mechanism doesn't introduce any runtime overhead.
  • Consider how this approach might impact the developer experience (e.g., IDE auto-completion).

Examples

Example 1: FEATURE_FLAG = true

// myModule.ts
const FEATURE_FLAG = true;

function advancedFeature() {
  console.log("Advanced feature enabled!");
}

if (FEATURE_FLAG) {
  export { advancedFeature };
}
// anotherModule.ts
import { advancedFeature } from './myModule';

advancedFeature(); // Output: Advanced feature enabled!

Explanation: Because FEATURE_FLAG is true, advancedFeature is exported, and the import statement in anotherModule.ts works correctly.

Example 2: FEATURE_FLAG = false

// myModule.ts
const FEATURE_FLAG = false;

function advancedFeature() {
  console.log("Advanced feature enabled!");
}

if (FEATURE_FLAG) {
  export { advancedFeature };
}
// anotherModule.ts
import { advancedFeature } from './myModule'; // TypeScript compilation error: Cannot find name 'advancedFeature'.

Explanation: Because FEATURE_FLAG is false, advancedFeature is not exported. The import statement in anotherModule.ts will result in a compile-time error.

Constraints

  • The solution must be written in TypeScript.
  • The solution must use standard TypeScript module export syntax.
  • The solution must not rely on external libraries or build tools beyond the TypeScript compiler.
  • The solution should be relatively concise and easy to understand.
  • The advancedFeature function should perform a simple action (e.g., logging a message) to demonstrate its functionality.

Notes

  • Consider using a simple if statement to control the export.
  • The goal is to prevent the function from being available in the module's public API when the feature is disabled.
  • Think about how this approach can be extended to conditionally export multiple functions or even entire classes.
  • This technique is useful for managing feature flags and creating modular codebases.
Loading editor...
typescript