CARVIEW |
Select Language
HTTP/2 200
date: Wed, 23 Jul 2025 15:29:59 GMT
content-type: text/html; charset=utf-8
cache-control: max-age=0, private, must-revalidate
content-security-policy: default-src 'none'; base-uri 'self'; child-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/; connect-src 'self' uploads.github.com www.githubstatus.com collector.github.com raw.githubusercontent.com api.github.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com *.rel.tunnels.api.visualstudio.com wss://*.rel.tunnels.api.visualstudio.com objects-origin.githubusercontent.com copilot-proxy.githubusercontent.com proxy.individual.githubcopilot.com proxy.business.githubcopilot.com proxy.enterprise.githubcopilot.com *.actions.githubusercontent.com wss://*.actions.githubusercontent.com productionresultssa0.blob.core.windows.net/ productionresultssa1.blob.core.windows.net/ productionresultssa2.blob.core.windows.net/ productionresultssa3.blob.core.windows.net/ productionresultssa4.blob.core.windows.net/ productionresultssa5.blob.core.windows.net/ productionresultssa6.blob.core.windows.net/ productionresultssa7.blob.core.windows.net/ productionresultssa8.blob.core.windows.net/ productionresultssa9.blob.core.windows.net/ productionresultssa10.blob.core.windows.net/ productionresultssa11.blob.core.windows.net/ productionresultssa12.blob.core.windows.net/ productionresultssa13.blob.core.windows.net/ productionresultssa14.blob.core.windows.net/ productionresultssa15.blob.core.windows.net/ productionresultssa16.blob.core.windows.net/ productionresultssa17.blob.core.windows.net/ productionresultssa18.blob.core.windows.net/ productionresultssa19.blob.core.windows.net/ github-production-repository-image-32fea6.s3.amazonaws.com github-production-release-asset-2e65be.s3.amazonaws.com insights.github.com wss://alive.github.com api.githubcopilot.com api.individual.githubcopilot.com api.business.githubcopilot.com api.enterprise.githubcopilot.com; font-src github.githubassets.com; form-action 'self' github.com gist.github.com copilot-workspace.githubnext.com objects-origin.githubusercontent.com; frame-ancestors 'none'; frame-src viewscreen.githubusercontent.com notebooks.githubusercontent.com; img-src 'self' data: blob: github.githubassets.com media.githubusercontent.com camo.githubusercontent.com identicons.github.com avatars.githubusercontent.com private-avatars.githubusercontent.com github-cloud.s3.amazonaws.com objects.githubusercontent.com release-assets.githubusercontent.com secured-user-images.githubusercontent.com/ user-images.githubusercontent.com/ private-user-images.githubusercontent.com opengraph.githubassets.com copilotprodattachments.blob.core.windows.net/github-production-copilot-attachments/ github-production-user-asset-6210df.s3.amazonaws.com customer-stories-feed.github.com spotlights-feed.github.com objects-origin.githubusercontent.com *.githubusercontent.com; manifest-src 'self'; media-src github.com user-images.githubusercontent.com/ secured-user-images.githubusercontent.com/ private-user-images.githubusercontent.com github-production-user-asset-6210df.s3.amazonaws.com gist.github.com; script-src github.githubassets.com; style-src 'unsafe-inline' github.githubassets.com; upgrade-insecure-requests; worker-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/
link: ; rel=preload; as=fetch; crossorigin=use-credentials
referrer-policy: no-referrer-when-downgrade
server-timing: issue_layout-fragment;desc="issue_layout fragment";dur=231.362086,issue_conversation_content-fragment;desc="issue_conversation_content fragment";dur=612.068101,issue_conversation_sidebar-fragment;desc="issue_conversation_sidebar fragment";dur=64.895555,nginx;desc="NGINX";dur=1.082647,glb;desc="GLB";dur=100.649749
strict-transport-security: max-age=31536000; includeSubdomains; preload
vary: X-PJAX, X-PJAX-Container, Turbo-Visit, Turbo-Frame, X-Requested-With, Accept,Accept-Encoding, Accept, X-Requested-With
x-content-type-options: nosniff
x-frame-options: deny
x-voltron-version: fd8fbbc
x-xss-protection: 0
server: github.com
content-encoding: gzip
accept-ranges: bytes
set-cookie: _gh_sess=9bp1kmGMRP8q2wtKLqQYLBKCBnec4AUAZ3ybK9t%2BWGh%2BjA8ea%2F4l8o7tFhLjNNzUkl75jMB2iGygCxlCgeqIZrEnRVfrj%2BszR8KIKseIw7xI7nzA2fWGQjXcSI4VQTwjZrcM0X5toV9W8X4xusTG%2BMaRrtligV2cnletwN5BYqMjqew3dHEodFtN1ZFrhYXvPtjFKBG%2FKNLo70or1%2BUf1GTzRskt0sdnw10GDMhUQbn18PdiN1A1jWKyZCdST7Aft%2FjLRPIdr40pr8r3L05n2A%3D%3D--6atQ3tJ7HuOMYuqE--5yC5tc66ycAghONahpmQCA%3D%3D; Path=/; HttpOnly; Secure; SameSite=Lax
set-cookie: _octo=GH1.1.727545602.1753284598; Path=/; Domain=github.com; Expires=Thu, 23 Jul 2026 15:29:58 GMT; Secure; SameSite=Lax
set-cookie: logged_in=no; Path=/; Domain=github.com; Expires=Thu, 23 Jul 2026 15:29:58 GMT; HttpOnly; Secure; SameSite=Lax
x-github-request-id: ED64:B5FA6:DE2669:106D5AE:6880FFF6
Support Const Type Constraint Β· Issue #41114 Β· microsoft/TypeScript Β· GitHub
No one assignedNo typeNo projectsNo milestoneNone yetNo branches or pull requests
Skip to content
Navigation Menu
{{ message }}
-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Closed
Labels
Awaiting More FeedbackThis means we'd like to hear from more people who would be helped by this featureThis means we'd like to hear from more people who would be helped by this featureSuggestionAn idea for TypeScriptAn idea for TypeScript
Description
Search Terms
Const Type Constraint Literal
Suggestion
Add new syntax const T
or a global generic type Constant<T = any> = T extends const T ? T : never;
type ConstString = const string
is same as type ConstString = Constant<string>
.
- If
T
extendsstring | number | boolean | symbol | bigint | null | undefined
, requiresT
to be a constant. - If
T
isobject
orArray
, requires every member ofT
to be a constant. - If
T
isenum
, nothing to do, becauseenum
is same asconst enum
The difference with union literal is that type 'foo' | 'bar'
can only be 'foo' or 'bar', but type const string
can be any constant string.
Use Cases
- Sometimes we want to constrain a type or a parameter to be literal.
- It can help the TS compiler to recognize constant types better
Examples
let foo = 'foo'; // string
const bar= 'bar'; // 'bar'
const notConstant: const string = foo; // error
const trulyConstant: const string = bar; // success
type Baz = { baz: string } ;
const baz1: const Baz = { baz: 'baz' }; // success
const baz2: Baz = { baz: 'baz' }; // not a constant
const baz3: Baz = { baz: 'baz' } as const; // current available, same as baz1
type ConstArray<T> = const Array<T>;
// same as
type AnotherCosntArray<T> = Array<const T>;
function tuple<T extends ConstArray>(...args: T) {
return args;
}
const t1 = tuple(foo); // error!
const t2 = tuple(bar); // success! typeof t2 should be ['bar']
const t3 = tuple('a', 1, true, ['1'], baz1) // ['a', 1, true, ['1'], { baz: 'baz' }];
const t4 = tuple(baz2) // error!
let variable: const string = 'variable'; // this is possible
variable = 'another variable'; // success
variable = document.title; // error
let reactiveObject: const { foo: string } = { foo: 'foo' }; // success;
reactiveObject.foo = 'bar' // success
In fact, const
only affects the assignment behavior, and a const
type is considered to be the same as a non const
type when read it.
A const type
doesn't mean immutable, just means every primitive value should be literal, so maybe should call it literal type
.
Alternatives
- Only add
extends const
syntax, and add global generictype Constant<T = any> = T extends const ? T : never;
- Use
finally
orstatic
orliteral
(not exist in current keywords) keyword instead ofconst
- Use
type Literal
instead oftype Constant
.
Related issues
#30680 Suggestion: Const contexts for generic type inference
Checklist
My suggestion meets these guidelines:
- This wouldn't be a breaking change in existing TypeScript/JavaScript code
- This wouldn't change the runtime behavior of existing JavaScript code
- This could be implemented without emitting different JS based on the types of the expressions
- This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, etc.)
- This feature would agree with the rest of TypeScript's Design Goals.
awerlogus, harrysolovay, NN---, esquevin, rrousselGit and 13 more
Metadata
Metadata
Assignees
Labels
Awaiting More FeedbackThis means we'd like to hear from more people who would be helped by this featureThis means we'd like to hear from more people who would be helped by this featureSuggestionAn idea for TypeScriptAn idea for TypeScript
Type
Projects
Milestone
Relationships
Development
Issue actions
You canβt perform that action at this time.