Skip to content

Commit

Permalink
TS 5: Add support for const type parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
Gerrit0 committed Mar 19, 2023
1 parent aa36d85 commit 6a0bcfb
Show file tree
Hide file tree
Showing 6 changed files with 32 additions and 4 deletions.
1 change: 1 addition & 0 deletions .config/.prettierignore
Expand Up @@ -8,6 +8,7 @@
../src/test/renderer/specs
../src/test/renderer/testProject
../src/test/utils/options/readers/data/invalid2.json
../src/test/converter2/behavior/constTypeParam.ts
../static/main.js
../example/docs/
**/tmp
Expand Down
22 changes: 18 additions & 4 deletions src/lib/converter/factories/signature.ts
Expand Up @@ -284,10 +284,10 @@ function convertTypeParameters(

// There's no way to determine directly from a ts.TypeParameter what it's variance modifiers are
// so unfortunately we have to go back to the node for this...
const variance = getVariance(
param.getSymbol()?.declarations?.find(ts.isTypeParameterDeclaration)
?.modifiers
);
const declaration = param
.getSymbol()
?.declarations?.find(ts.isTypeParameterDeclaration);
const variance = getVariance(declaration?.modifiers);

const paramRefl = new TypeParameterReflection(
param.symbol.name,
Expand All @@ -296,6 +296,16 @@ function convertTypeParameters(
parent,
variance
);

// No way to determine this from the type parameter itself, need to go back to the declaration
if (
declaration?.modifiers?.some(
(m) => m.kind === ts.SyntaxKind.ConstKeyword
)
) {
paramRefl.flags.setFlag(ReflectionFlag.Const, true);
}

context.registerReflection(paramRefl, param.getSymbol());
context.trigger(ConverterEvents.CREATE_TYPE_PARAMETER, paramRefl);

Expand Down Expand Up @@ -329,6 +339,10 @@ export function createTypeParamReflection(
context.scope,
getVariance(param.modifiers)
);
if (param.modifiers?.some((m) => m.kind === ts.SyntaxKind.ConstKeyword)) {
paramRefl.flags.setFlag(ReflectionFlag.Const, true);
}

context.registerReflection(paramRefl, param.symbol);

if (ts.isJSDocTemplateTag(param.parent)) {
Expand Down
1 change: 1 addition & 0 deletions src/lib/output/themes/default/partials/typeParameters.tsx
Expand Up @@ -11,6 +11,7 @@ export function typeParameters(context: DefaultThemeRenderContext, typeParameter
{typeParameters?.map((item) => (
<li>
<h4>
{item.flags.isConst && "const "}
{item.varianceModifier ? `${item.varianceModifier} ` : ""}
{item.name}
{!!item.type && (
Expand Down
1 change: 1 addition & 0 deletions src/lib/output/themes/lib.tsx
Expand Up @@ -98,6 +98,7 @@ export function renderTypeParametersSignature(
<span class="tsd-signature-symbol">{"<"}</span>
{join(<span class="tsd-signature-symbol">{", "}</span>, typeParameters, (item) => (
<>
{item.flags.isConst && "const "}
{item.varianceModifier ? `${item.varianceModifier} ` : ""}
<span class="tsd-signature-type" data-tsd-kind={item.kindString}>
{item.name}
Expand Down
7 changes: 7 additions & 0 deletions src/test/behaviorTests.ts
Expand Up @@ -142,6 +142,13 @@ export const behaviorTests: {
);
},

constTypeParam(project) {
const getNamesExactly = query(project, "getNamesExactly");
const typeParams = getNamesExactly.signatures?.[0].typeParameters;
equal(typeParams?.length, 1);
equal(typeParams[0].flags.isConst, true);
},

declareGlobal(project) {
equal(
project.children?.map((c) => c.name),
Expand Down
4 changes: 4 additions & 0 deletions src/test/converter2/behavior/constTypeParam.ts
@@ -0,0 +1,4 @@
export type HasNames = { names: readonly string[] };
export function getNamesExactly<const T extends HasNames>(arg: T): T["names"] {
return arg.names;
}

0 comments on commit 6a0bcfb

Please sign in to comment.