diff --git a/CHANGELOG.md b/CHANGELOG.md index ced9083f79..095b991cf8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Fixed TypeScript enum imports to use `import type` for type aliases to support `verbatimModuleSyntax`. [#7332](https://github.com/microsoft/kiota/pull/7332) + ## [1.30.0] - 2026-01-26 ### Added diff --git a/src/Kiota.Builder/Writers/TypeScript/CodeUsingWriter.cs b/src/Kiota.Builder/Writers/TypeScript/CodeUsingWriter.cs index 7a40d7b2ed..06a82d8f63 100644 --- a/src/Kiota.Builder/Writers/TypeScript/CodeUsingWriter.cs +++ b/src/Kiota.Builder/Writers/TypeScript/CodeUsingWriter.cs @@ -46,6 +46,10 @@ private static bool GetShouldUseTypeImport(CodeUsing codeUsing) if (codeUsing.Declaration is CodeType codeType) { if (codeType.TypeDefinition is CodeInterface) return true; + // Enums are generated as TypeScript type aliases (e.g., `export type MyEnum = ...`), + // so they must use `import type` for compatibility with verbatimModuleSyntax. + // See: https://github.com/microsoft/kiota/issues/2959 + if (codeType.TypeDefinition is CodeEnum) return true; // this will handle edge cases for typescript Declarations that are already known to be interfaces: RequestConfiguration, QueryParameters, and Model classes if (codeType.TypeDefinition is CodeClass codeClass && codeClass.IsOfKind(CodeClassKind.RequestConfiguration, CodeClassKind.QueryParameters, CodeClassKind.Model)) return true; } diff --git a/tests/Kiota.Builder.Tests/Writers/TypeScript/CodeUsingWriterTests.cs b/tests/Kiota.Builder.Tests/Writers/TypeScript/CodeUsingWriterTests.cs index a196c8464f..b05c2e5aed 100644 --- a/tests/Kiota.Builder.Tests/Writers/TypeScript/CodeUsingWriterTests.cs +++ b/tests/Kiota.Builder.Tests/Writers/TypeScript/CodeUsingWriterTests.cs @@ -188,4 +188,30 @@ public void WritesImportTypeStatementForModel() Assert.Contains("// @ts-ignore", result); Assert.Contains("import { type Bar } from", result); } + + [Fact] + public void WritesImportTypeStatementForEnum() + { + // Enums are generated as TypeScript type aliases (e.g., `export type MyEnum = ...`), + // so they must use `import type` for compatibility with verbatimModuleSyntax. + // See: https://github.com/microsoft/kiota/issues/2959 + var usingWriter = new CodeUsingWriter("foo"); + var codeEnum = root.AddEnum(new CodeEnum + { + Name = "MyStatus", + }).First(); + var us = new CodeUsing + { + Name = "MyStatus", + Declaration = new CodeType + { + Name = codeEnum.Name, + TypeDefinition = codeEnum, + } + }; + usingWriter.WriteCodeElement(new CodeUsing[] { us }, root, writer); + var result = tw.ToString(); + Assert.Contains("// @ts-ignore", result); + Assert.Contains("import { type MyStatus } from", result); + } }