Intrinsic string types (#40580)

* Introduce Uppercase<T> and Lowercase<T> intrinsic types

* Accept new API baselines

* Add Uppercase/Lowercase/Capitalize/Uncapitalize to lib.d.ts

* Update fourslash

* Add an 'intrinsic' keyword

* Update template literal type tests

* Accept new API baselines

* Minor fixes

* Switch Capitalize<T> and Uncapitalize<T> to intrinsic types

* Add tests

* Accept new baselines

* Accept new baselines

* Remove template literal type casing modifiers

* Update tests

* Accept new baselines

* Add more tests

* Normalize nested template literal types

* Add normalization tests

* Accept new baselines

* Update tests
This commit is contained in:
Anders Hejlsberg
2020-09-21 07:09:29 -10:00
committed by GitHub
parent ce3dbef5f7
commit fbce4f6c98
30 changed files with 1739 additions and 850 deletions
+139 -53
View File
@@ -256,6 +256,20 @@ namespace ts {
VoidIsNonOptional = 1 << 1,
}
const enum IntrinsicTypeKind {
Uppercase,
Lowercase,
Capitalize,
Uncapitalize
}
const intrinsicTypeKinds: ReadonlyESMap<string, IntrinsicTypeKind> = new Map(getEntries({
Uppercase: IntrinsicTypeKind.Uppercase,
Lowercase: IntrinsicTypeKind.Lowercase,
Capitalize: IntrinsicTypeKind.Capitalize,
Uncapitalize: IntrinsicTypeKind.Uncapitalize
}));
function SymbolLinks(this: SymbolLinks) {
}
@@ -705,6 +719,7 @@ namespace ts {
const literalTypes = new Map<string, LiteralType>();
const indexedAccessTypes = new Map<string, IndexedAccessType>();
const templateLiteralTypes = new Map<string, TemplateLiteralType>();
const stringMappingTypes = new Map<string, StringMappingType>();
const substitutionTypes = new Map<string, SubstitutionType>();
const evolvingArrayTypes: EvolvingArrayType[] = [];
const undefinedProperties: SymbolTable = new Map();
@@ -717,6 +732,7 @@ namespace ts {
const wildcardType = createIntrinsicType(TypeFlags.Any, "any");
const errorType = createIntrinsicType(TypeFlags.Any, "error");
const nonInferrableAnyType = createIntrinsicType(TypeFlags.Any, "any", ObjectFlags.ContainsWideningType);
const intrinsicMarkerType = createIntrinsicType(TypeFlags.Any, "intrinsic");
const unknownType = createIntrinsicType(TypeFlags.Unknown, "unknown");
const undefinedType = createIntrinsicType(TypeFlags.Undefined, "undefined");
const undefinedWideningType = strictNullChecks ? undefinedType : createIntrinsicType(TypeFlags.Undefined, "undefined", ObjectFlags.ContainsWideningType);
@@ -4344,7 +4360,7 @@ namespace ts {
if (type.flags & TypeFlags.Any) {
context.approximateLength += 3;
return factory.createKeywordTypeNode(SyntaxKind.AnyKeyword);
return factory.createKeywordTypeNode(type === intrinsicMarkerType ? SyntaxKind.IntrinsicKeyword : SyntaxKind.AnyKeyword);
}
if (type.flags & TypeFlags.Unknown) {
return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);
@@ -4505,17 +4521,19 @@ namespace ts {
}
if (type.flags & TypeFlags.TemplateLiteral) {
const texts = (<TemplateLiteralType>type).texts;
const casings = (<TemplateLiteralType>type).casings;
const types = (<TemplateLiteralType>type).types;
const templateHead = factory.createTemplateHead(texts[0]);
const templateSpans = factory.createNodeArray(
map(types, (t, i) => factory.createTemplateLiteralTypeSpan(
casings[i],
typeToTypeNodeHelper(t, context),
(i < types.length - 1 ? factory.createTemplateMiddle : factory.createTemplateTail)(texts[i + 1]))));
context.approximateLength += 2;
return factory.createTemplateLiteralType(templateHead, templateSpans);
}
if (type.flags & TypeFlags.StringMapping) {
const typeNode = typeToTypeNodeHelper((<StringMappingType>type).type, context);
return symbolToTypeNode((<StringMappingType>type).symbol, context, SymbolFlags.Type, [typeNode]);
}
if (type.flags & TypeFlags.IndexedAccess) {
const objectTypeNode = typeToTypeNodeHelper((<IndexedAccessType>type).objectType, context);
const indexTypeNode = typeToTypeNodeHelper((<IndexedAccessType>type).indexType, context);
@@ -10824,7 +10842,7 @@ namespace ts {
}
function getBaseConstraintOfType(type: Type): Type | undefined {
if (type.flags & (TypeFlags.InstantiableNonPrimitive | TypeFlags.UnionOrIntersection | TypeFlags.TemplateLiteral)) {
if (type.flags & (TypeFlags.InstantiableNonPrimitive | TypeFlags.UnionOrIntersection | TypeFlags.TemplateLiteral | TypeFlags.StringMapping)) {
const constraint = getResolvedBaseConstraint(<InstantiableType | UnionOrIntersectionType>type);
return constraint !== noConstraintType && constraint !== circularConstraintType ? constraint : undefined;
}
@@ -10922,7 +10940,11 @@ namespace ts {
if (t.flags & TypeFlags.TemplateLiteral) {
const types = (<TemplateLiteralType>t).types;
const constraints = mapDefined(types, getBaseConstraint);
return constraints.length === types.length ? getTemplateLiteralType((<TemplateLiteralType>t).texts, (<TemplateLiteralType>t).casings, constraints) : stringType;
return constraints.length === types.length ? getTemplateLiteralType((<TemplateLiteralType>t).texts, constraints) : stringType;
}
if (t.flags & TypeFlags.StringMapping) {
const constraint = getBaseConstraint((<StringMappingType>t).type);
return constraint ? getStringMappingType((<StringMappingType>t).symbol, constraint) : stringType;
}
if (t.flags & TypeFlags.IndexedAccess) {
const baseObjectType = getBaseConstraint((<IndexedAccessType>t).objectType);
@@ -12128,6 +12150,9 @@ namespace ts {
function getTypeAliasInstantiation(symbol: Symbol, typeArguments: readonly Type[] | undefined): Type {
const type = getDeclaredTypeOfSymbol(symbol);
if (type === intrinsicMarkerType && intrinsicTypeKinds.has(symbol.escapedName as string) && typeArguments && typeArguments.length === 1) {
return getStringMappingType(symbol, typeArguments[0]);
}
const links = getSymbolLinks(symbol);
const typeParameters = links.typeParameters!;
const id = getTypeListId(typeArguments);
@@ -13465,50 +13490,58 @@ namespace ts {
if (!links.resolvedType) {
links.resolvedType = getTemplateLiteralType(
[node.head.text, ...map(node.templateSpans, span => span.literal.text)],
map(node.templateSpans, span => span.casing),
map(node.templateSpans, span => getTypeFromTypeNode(span.type)));
}
return links.resolvedType;
}
function getTemplateLiteralType(texts: readonly string[], casings: readonly TemplateCasing[], types: readonly Type[]): Type {
function getTemplateLiteralType(texts: readonly string[], types: readonly Type[]): Type {
const unionIndex = findIndex(types, t => !!(t.flags & (TypeFlags.Never | TypeFlags.Union)));
if (unionIndex >= 0) {
return checkCrossProductUnion(types) ?
mapType(types[unionIndex], t => getTemplateLiteralType(texts, casings, replaceElement(types, unionIndex, t))) :
mapType(types[unionIndex], t => getTemplateLiteralType(texts, replaceElement(types, unionIndex, t))) :
errorType;
}
const newTypes = [];
const newCasings = [];
const newTexts = [];
const newTypes: Type[] = [];
const newTexts: string[] = [];
let text = texts[0];
for (let i = 0; i < types.length; i++) {
const t = types[i];
if (t.flags & TypeFlags.Literal) {
const s = applyTemplateCasing(getTemplateStringForType(t) || "", casings[i]);
text += s;
text += texts[i + 1];
}
else if (isGenericIndexType(t)) {
newTypes.push(t);
newCasings.push(casings[i]);
newTexts.push(text);
text = texts[i + 1];
}
else {
return stringType;
}
if (!addSpans(texts, types)) {
return stringType;
}
if (newTypes.length === 0) {
return getLiteralType(text);
}
newTexts.push(text);
const id = `${getTypeListId(newTypes)}|${newCasings.join(",")}|${map(newTexts, t => t.length).join(",")}|${newTexts.join("")}`;
const id = `${getTypeListId(newTypes)}|${map(newTexts, t => t.length).join(",")}|${newTexts.join("")}`;
let type = templateLiteralTypes.get(id);
if (!type) {
templateLiteralTypes.set(id, type = createTemplateLiteralType(newTexts, newCasings, newTypes));
templateLiteralTypes.set(id, type = createTemplateLiteralType(newTexts, newTypes));
}
return type;
function addSpans(texts: readonly string[], types: readonly Type[]): boolean {
for (let i = 0; i < types.length; i++) {
const t = types[i];
if (t.flags & TypeFlags.Literal) {
text += getTemplateStringForType(t) || "";
text += texts[i + 1];
}
else if (t.flags & TypeFlags.TemplateLiteral) {
text += (<TemplateLiteralType>t).texts[0];
if (!addSpans((<TemplateLiteralType>t).texts, (<TemplateLiteralType>t).types)) return false;
text += texts[i + 1];
}
else if (isGenericIndexType(t)) {
newTypes.push(t);
newTexts.push(text);
text = texts[i + 1];
}
else {
return false;
}
}
return true;
}
}
function getTemplateStringForType(type: Type) {
@@ -13519,22 +13552,44 @@ namespace ts {
undefined;
}
function applyTemplateCasing(str: string, casing: TemplateCasing) {
switch (casing) {
case TemplateCasing.Uppercase: return str.toUpperCase();
case TemplateCasing.Lowercase: return str.toLowerCase();
case TemplateCasing.Capitalize: return str.charAt(0).toUpperCase() + str.slice(1);
case TemplateCasing.Uncapitalize: return str.charAt(0).toLowerCase() + str.slice(1);
function createTemplateLiteralType(texts: readonly string[], types: readonly Type[]) {
const type = <TemplateLiteralType>createType(TypeFlags.TemplateLiteral);
type.texts = texts;
type.types = types;
return type;
}
function getStringMappingType(symbol: Symbol, type: Type): Type {
return type.flags & (TypeFlags.Union | TypeFlags.Never) ? mapType(type, t => getStringMappingType(symbol, t)) :
isGenericIndexType(type) ? getStringMappingTypeForGenericType(symbol, type) :
type.flags & TypeFlags.StringLiteral ? getLiteralType(applyStringMapping(symbol, (<StringLiteralType>type).value)) :
type;
}
function applyStringMapping(symbol: Symbol, str: string) {
switch (intrinsicTypeKinds.get(symbol.escapedName as string)) {
case IntrinsicTypeKind.Uppercase: return str.toUpperCase();
case IntrinsicTypeKind.Lowercase: return str.toLowerCase();
case IntrinsicTypeKind.Capitalize: return str.charAt(0).toUpperCase() + str.slice(1);
case IntrinsicTypeKind.Uncapitalize: return str.charAt(0).toLowerCase() + str.slice(1);
}
return str;
}
function createTemplateLiteralType(texts: readonly string[], casings: readonly TemplateCasing[], types: readonly Type[]) {
const type = <TemplateLiteralType>createType(TypeFlags.TemplateLiteral);
type.texts = texts;
type.casings = casings;
type.types = types;
return type;
function getStringMappingTypeForGenericType(symbol: Symbol, type: Type): Type {
const id = `${getSymbolId(symbol)},${getTypeId(type)}`;
let result = stringMappingTypes.get(id);
if (!result) {
stringMappingTypes.set(id, result = createStringMappingType(symbol, type));
}
return result;
}
function createStringMappingType(symbol: Symbol, type: Type) {
const result = <StringMappingType>createType(TypeFlags.StringMapping);
result.symbol = symbol;
result.type = type;
return result;
}
function createIndexedAccessType(objectType: Type, indexType: Type, aliasSymbol: Symbol | undefined, aliasTypeArguments: readonly Type[] | undefined) {
@@ -13772,7 +13827,7 @@ namespace ts {
}
return !!((<UnionOrIntersectionType>type).objectFlags & ObjectFlags.IsGenericIndexType);
}
return !!(type.flags & (TypeFlags.InstantiableNonPrimitive | TypeFlags.Index | TypeFlags.TemplateLiteral));
return !!(type.flags & (TypeFlags.InstantiableNonPrimitive | TypeFlags.Index | TypeFlags.TemplateLiteral | TypeFlags.StringMapping));
}
function isThisTypeParameter(type: Type): boolean {
@@ -14278,7 +14333,7 @@ namespace ts {
}
function isEmptyObjectTypeOrSpreadsIntoEmptyObject(type: Type) {
return isEmptyObjectType(type) || !!(type.flags & (TypeFlags.Null | TypeFlags.Undefined | TypeFlags.BooleanLike | TypeFlags.NumberLike | TypeFlags.BigIntLike | TypeFlags.StringLike | TypeFlags.EnumLike | TypeFlags.NonPrimitive | TypeFlags.Index | TypeFlags.TemplateLiteral));
return isEmptyObjectType(type) || !!(type.flags & (TypeFlags.Null | TypeFlags.Undefined | TypeFlags.BooleanLike | TypeFlags.NumberLike | TypeFlags.BigIntLike | TypeFlags.StringLike | TypeFlags.EnumLike | TypeFlags.NonPrimitive | TypeFlags.Index));
}
function isSinglePropertyAnonymousObjectType(type: Type) {
@@ -14364,7 +14419,7 @@ namespace ts {
}
return mapType(right, t => getSpreadType(left, t, symbol, objectFlags, readonly));
}
if (right.flags & (TypeFlags.BooleanLike | TypeFlags.NumberLike | TypeFlags.BigIntLike | TypeFlags.StringLike | TypeFlags.EnumLike | TypeFlags.NonPrimitive | TypeFlags.Index | TypeFlags.TemplateLiteral)) {
if (right.flags & (TypeFlags.BooleanLike | TypeFlags.NumberLike | TypeFlags.BigIntLike | TypeFlags.StringLike | TypeFlags.EnumLike | TypeFlags.NonPrimitive | TypeFlags.Index)) {
return left;
}
@@ -14642,6 +14697,8 @@ namespace ts {
return neverType;
case SyntaxKind.ObjectKeyword:
return node.flags & NodeFlags.JavaScriptFile && !noImplicitAny ? anyType : nonPrimitiveType;
case SyntaxKind.IntrinsicKeyword:
return intrinsicMarkerType;
case SyntaxKind.ThisType:
case SyntaxKind.ThisKeyword as TypeNodeSyntaxKind:
// TODO(rbuckton): `ThisKeyword` is no longer a `TypeNode`, but we defensively allow it here because of incorrect casts in the Language Service and because of `isPartOfTypeNode`.
@@ -15166,7 +15223,10 @@ namespace ts {
return getIndexType(instantiateType((<IndexType>type).type, mapper));
}
if (flags & TypeFlags.TemplateLiteral) {
return getTemplateLiteralType((<TemplateLiteralType>type).texts, (<TemplateLiteralType>type).casings, instantiateTypes((<TemplateLiteralType>type).types, mapper));
return getTemplateLiteralType((<TemplateLiteralType>type).texts, instantiateTypes((<TemplateLiteralType>type).types, mapper));
}
if (flags & TypeFlags.StringMapping) {
return getStringMappingType((<StringMappingType>type).symbol, instantiateType((<StringMappingType>type).type, mapper));
}
if (flags & TypeFlags.IndexedAccess) {
return getIndexedAccessType(instantiateType((<IndexedAccessType>type).objectType, mapper), instantiateType((<IndexedAccessType>type).indexType, mapper), /*accessNode*/ undefined, type.aliasSymbol, instantiateTypes(type.aliasTypeArguments, mapper));
@@ -17323,6 +17383,21 @@ namespace ts {
return result;
}
}
else if (source.flags & TypeFlags.StringMapping) {
if (target.flags & TypeFlags.StringMapping && (<StringMappingType>source).symbol === (<StringMappingType>target).symbol) {
if (result = isRelatedTo((<StringMappingType>source).type, (<StringMappingType>target).type, reportErrors)) {
resetErrorInfo(saveErrorInfo);
return result;
}
}
else {
const constraint = getBaseConstraintOfType(source);
if (constraint && (result = isRelatedTo(constraint, target, reportErrors))) {
resetErrorInfo(saveErrorInfo);
return result;
}
}
}
else if (source.flags & TypeFlags.Conditional) {
if (target.flags & TypeFlags.Conditional) {
// Two conditional types 'T1 extends U1 ? X1 : Y1' and 'T2 extends U2 ? X2 : Y2' are related if
@@ -19767,6 +19842,11 @@ namespace ts {
inferFromTypes((<IndexedAccessType>source).objectType, (<IndexedAccessType>target).objectType);
inferFromTypes((<IndexedAccessType>source).indexType, (<IndexedAccessType>target).indexType);
}
else if (source.flags & TypeFlags.StringMapping && target.flags & TypeFlags.StringMapping) {
if ((<StringMappingType>source).symbol === (<StringMappingType>target).symbol) {
inferFromTypes((<StringMappingType>source).type, (<StringMappingType>target).type);
}
}
else if (target.flags & TypeFlags.Conditional) {
invokeOnce(source, target, inferToConditionalType);
}
@@ -20063,7 +20143,7 @@ namespace ts {
function inferToTemplateLiteralType(source: Type, target: TemplateLiteralType) {
const matches = source.flags & TypeFlags.StringLiteral ? inferLiteralsFromTemplateLiteralType(<StringLiteralType>source, target) :
source.flags & TypeFlags.TemplateLiteral && arraysEqual((<TemplateLiteralType>source).texts, target.texts) && arraysEqual((<TemplateLiteralType>source).casings, target.casings)? (<TemplateLiteralType>source).types :
source.flags & TypeFlags.TemplateLiteral && arraysEqual((<TemplateLiteralType>source).texts, target.texts) ? (<TemplateLiteralType>source).types :
undefined;
const types = target.types;
for (let i = 0; i < types.length; i++) {
@@ -20257,7 +20337,7 @@ namespace ts {
function hasPrimitiveConstraint(type: TypeParameter): boolean {
const constraint = getConstraintOfTypeParameter(type);
return !!constraint && maybeTypeOfKind(constraint.flags & TypeFlags.Conditional ? getDefaultConstraintOfConditionalType(constraint as ConditionalType) : constraint, TypeFlags.Primitive | TypeFlags.Index | TypeFlags.TemplateLiteral);
return !!constraint && maybeTypeOfKind(constraint.flags & TypeFlags.Conditional ? getDefaultConstraintOfConditionalType(constraint as ConditionalType) : constraint, TypeFlags.Primitive | TypeFlags.Index | TypeFlags.TemplateLiteral | TypeFlags.StringMapping);
}
function isObjectLiteralType(type: Type) {
@@ -26319,7 +26399,7 @@ namespace ts {
else {
const contextualType = getIndexedAccessType(restType, getLiteralType(i - index));
const argType = checkExpressionWithContextualType(arg, contextualType, context, checkMode);
const hasPrimitiveContextualType = maybeTypeOfKind(contextualType, TypeFlags.Primitive | TypeFlags.Index | TypeFlags.TemplateLiteral);
const hasPrimitiveContextualType = maybeTypeOfKind(contextualType, TypeFlags.Primitive | TypeFlags.Index | TypeFlags.TemplateLiteral | TypeFlags.StringMapping);
types.push(hasPrimitiveContextualType ? getRegularTypeOfLiteralType(argType) : getWidenedLiteralType(argType));
flags.push(ElementFlags.Required);
}
@@ -29380,7 +29460,7 @@ namespace ts {
// and the right operand to be of type Any, an object type, or a type parameter type.
// The result is always of the Boolean primitive type.
if (!(allTypesAssignableToKind(leftType, TypeFlags.StringLike | TypeFlags.NumberLike | TypeFlags.ESSymbolLike) ||
isTypeAssignableToKind(leftType, TypeFlags.Index | TypeFlags.TemplateLiteral | TypeFlags.TypeParameter))) {
isTypeAssignableToKind(leftType, TypeFlags.Index | TypeFlags.TemplateLiteral | TypeFlags.StringMapping | TypeFlags.TypeParameter))) {
error(left, Diagnostics.The_left_hand_side_of_an_in_expression_must_be_of_type_any_string_number_or_symbol);
}
if (!allTypesAssignableToKind(rightType, TypeFlags.NonPrimitive | TypeFlags.InstantiableNonPrimitive)) {
@@ -30334,7 +30414,7 @@ namespace ts {
}
// If the contextual type is a literal of a particular primitive type, we consider this a
// literal context for all literals of that primitive type.
return !!(contextualType.flags & (TypeFlags.StringLiteral | TypeFlags.Index | TypeFlags.TemplateLiteral) && maybeTypeOfKind(candidateType, TypeFlags.StringLiteral) ||
return !!(contextualType.flags & (TypeFlags.StringLiteral | TypeFlags.Index | TypeFlags.TemplateLiteral | TypeFlags.StringMapping) && maybeTypeOfKind(candidateType, TypeFlags.StringLiteral) ||
contextualType.flags & TypeFlags.NumberLiteral && maybeTypeOfKind(candidateType, TypeFlags.NumberLiteral) ||
contextualType.flags & TypeFlags.BigIntLiteral && maybeTypeOfKind(candidateType, TypeFlags.BigIntLiteral) ||
contextualType.flags & TypeFlags.BooleanLiteral && maybeTypeOfKind(candidateType, TypeFlags.BooleanLiteral) ||
@@ -35316,12 +35396,18 @@ namespace ts {
function checkTypeAliasDeclaration(node: TypeAliasDeclaration) {
// Grammar checking
checkGrammarDecoratorsAndModifiers(node);
checkTypeNameIsReserved(node.name, Diagnostics.Type_alias_name_cannot_be_0);
checkExportsOnMergedDeclarations(node);
checkTypeParameters(node.typeParameters);
checkSourceElement(node.type);
registerForUnusedIdentifiersCheck(node);
if (node.type.kind === SyntaxKind.IntrinsicKeyword) {
if (!intrinsicTypeKinds.has(node.name.escapedText as string) || length(node.typeParameters) !== 1) {
error(node.type, Diagnostics.The_intrinsic_keyword_can_only_be_used_to_declare_compiler_provided_intrinsic_types);
}
}
else {
checkSourceElement(node.type);
registerForUnusedIdentifiersCheck(node);
}
}
function computeEnumMemberValues(node: EnumDeclaration) {
+4
View File
@@ -3043,6 +3043,10 @@
"category": "Error",
"code": 2794
},
"The 'intrinsic' keyword can only be used to declare compiler provided intrinsic types.": {
"category": "Error",
"code": 2795
},
"Import declaration '{0}' is using private name '{1}'.": {
"category": "Error",
-9
View File
@@ -2023,15 +2023,6 @@ namespace ts {
}
function emitTemplateTypeSpan(node: TemplateLiteralTypeSpan) {
const keyword = node.casing === TemplateCasing.Uppercase ? "uppercase" :
node.casing === TemplateCasing.Lowercase ? "lowercase" :
node.casing === TemplateCasing.Capitalize ? "capitalize" :
node.casing === TemplateCasing.Uncapitalize ? "uncapitalize" :
undefined;
if (keyword) {
writeKeyword(keyword);
writeSpace();
}
emit(node.type);
emit(node.literal);
}
+4 -6
View File
@@ -1605,9 +1605,8 @@ namespace ts {
}
// @api
function createTemplateLiteralTypeSpan(casing: TemplateCasing, type: TypeNode, literal: TemplateMiddle | TemplateTail) {
function createTemplateLiteralTypeSpan(type: TypeNode, literal: TemplateMiddle | TemplateTail) {
const node = createBaseNode<TemplateLiteralTypeSpan>(SyntaxKind.TemplateLiteralTypeSpan);
node.casing = casing;
node.type = type;
node.literal = literal;
node.transformFlags = TransformFlags.ContainsTypeScript;
@@ -1615,11 +1614,10 @@ namespace ts {
}
// @api
function updateTemplateLiteralTypeSpan(casing: TemplateCasing, node: TemplateLiteralTypeSpan, type: TypeNode, literal: TemplateMiddle | TemplateTail) {
return node.casing !== casing
|| node.type !== type
function updateTemplateLiteralTypeSpan(node: TemplateLiteralTypeSpan, type: TypeNode, literal: TemplateMiddle | TemplateTail) {
return node.type !== type
|| node.literal !== literal
? update(createTemplateLiteralTypeSpan(casing, type, literal), node)
? update(createTemplateLiteralTypeSpan(type, literal), node)
: node;
}
+1 -10
View File
@@ -2618,7 +2618,6 @@ namespace ts {
const pos = getNodePos();
return finishNode(
factory.createTemplateLiteralTypeSpan(
parseTemplateCasing(),
parseType(),
parseLiteralOfTemplateSpan(/*isTaggedTemplate*/ false)
),
@@ -2626,14 +2625,6 @@ namespace ts {
);
}
function parseTemplateCasing(): TemplateCasing {
return parseOptional(SyntaxKind.UppercaseKeyword) ? TemplateCasing.Uppercase :
parseOptional(SyntaxKind.LowercaseKeyword) ? TemplateCasing.Lowercase :
parseOptional(SyntaxKind.CapitalizeKeyword) ? TemplateCasing.Capitalize :
parseOptional(SyntaxKind.UncapitalizeKeyword) ? TemplateCasing.Uncapitalize :
TemplateCasing.None;
}
function parseLiteralOfTemplateSpan(isTaggedTemplate: boolean) {
if (token() === SyntaxKind.CloseBraceToken) {
reScanTemplateToken(isTaggedTemplate);
@@ -6751,7 +6742,7 @@ namespace ts {
const name = parseIdentifier();
const typeParameters = parseTypeParameters();
parseExpected(SyntaxKind.EqualsToken);
const type = parseType();
const type = token() === SyntaxKind.IntrinsicKeyword && tryParse(parseKeywordAndNoDot) || parseType();
parseSemicolon();
const node = factory.createTypeAliasDeclaration(decorators, modifiers, name, typeParameters, type);
return withJSDoc(finishNode(node, pos), hasJSDoc);
+1 -4
View File
@@ -111,6 +111,7 @@ namespace ts {
infer: SyntaxKind.InferKeyword,
instanceof: SyntaxKind.InstanceOfKeyword,
interface: SyntaxKind.InterfaceKeyword,
intrinsic: SyntaxKind.IntrinsicKeyword,
is: SyntaxKind.IsKeyword,
keyof: SyntaxKind.KeyOfKeyword,
let: SyntaxKind.LetKeyword,
@@ -151,10 +152,6 @@ namespace ts {
yield: SyntaxKind.YieldKeyword,
async: SyntaxKind.AsyncKeyword,
await: SyntaxKind.AwaitKeyword,
uppercase: SyntaxKind.UppercaseKeyword,
lowercase: SyntaxKind.LowercaseKeyword,
capitalize: SyntaxKind.CapitalizeKeyword,
uncapitalize: SyntaxKind.UncapitalizeKeyword,
of: SyntaxKind.OfKeyword,
};
+15 -24
View File
@@ -167,6 +167,7 @@ namespace ts {
DeclareKeyword,
GetKeyword,
InferKeyword,
IntrinsicKeyword,
IsKeyword,
KeyOfKeyword,
ModuleKeyword,
@@ -186,10 +187,6 @@ namespace ts {
FromKeyword,
GlobalKeyword,
BigIntKeyword,
UppercaseKeyword,
LowercaseKeyword,
CapitalizeKeyword,
UncapitalizeKeyword,
OfKeyword, // LastKeyword and LastToken and LastContextualKeyword
// Parse tree nodes
@@ -544,7 +541,6 @@ namespace ts {
| SyntaxKind.BigIntKeyword
| SyntaxKind.BooleanKeyword
| SyntaxKind.BreakKeyword
| SyntaxKind.CapitalizeKeyword
| SyntaxKind.CaseKeyword
| SyntaxKind.CatchKeyword
| SyntaxKind.ClassKeyword
@@ -574,10 +570,10 @@ namespace ts {
| SyntaxKind.InKeyword
| SyntaxKind.InstanceOfKeyword
| SyntaxKind.InterfaceKeyword
| SyntaxKind.IntrinsicKeyword
| SyntaxKind.IsKeyword
| SyntaxKind.KeyOfKeyword
| SyntaxKind.LetKeyword
| SyntaxKind.LowercaseKeyword
| SyntaxKind.ModuleKeyword
| SyntaxKind.NamespaceKeyword
| SyntaxKind.NeverKeyword
@@ -605,11 +601,9 @@ namespace ts {
| SyntaxKind.TryKeyword
| SyntaxKind.TypeKeyword
| SyntaxKind.TypeOfKeyword
| SyntaxKind.UncapitalizeKeyword
| SyntaxKind.UndefinedKeyword
| SyntaxKind.UniqueKeyword
| SyntaxKind.UnknownKeyword
| SyntaxKind.UppercaseKeyword
| SyntaxKind.VarKeyword
| SyntaxKind.VoidKeyword
| SyntaxKind.WhileKeyword
@@ -635,6 +629,7 @@ namespace ts {
| SyntaxKind.AnyKeyword
| SyntaxKind.BigIntKeyword
| SyntaxKind.BooleanKeyword
| SyntaxKind.IntrinsicKeyword
| SyntaxKind.NeverKeyword
| SyntaxKind.NumberKeyword
| SyntaxKind.ObjectKeyword
@@ -1665,19 +1660,10 @@ namespace ts {
export interface TemplateLiteralTypeSpan extends TypeNode {
readonly kind: SyntaxKind.TemplateLiteralTypeSpan,
readonly parent: TemplateLiteralTypeNode;
readonly casing: TemplateCasing;
readonly type: TypeNode;
readonly literal: TemplateMiddle | TemplateTail;
}
export const enum TemplateCasing {
None,
Uppercase,
Lowercase,
Capitalize,
Uncapitalize,
}
// Note: 'brands' in our syntax nodes serve to give us a small amount of nominal typing.
// Consider 'Expression'. Without the brand, 'Expression' is actually no different
// (structurally) than 'Node'. Because of this you can pass any Node to a function that
@@ -4892,6 +4878,7 @@ namespace ts {
Substitution = 1 << 25, // Type parameter substitution
NonPrimitive = 1 << 26, // intrinsic object type
TemplateLiteral = 1 << 27, // Template literal type
StringMapping = 1 << 28, // Uppercase/Lowercase type
/* @internal */
AnyOrUnknown = Any | Unknown,
@@ -4909,7 +4896,7 @@ namespace ts {
Intrinsic = Any | Unknown | String | Number | BigInt | Boolean | BooleanLiteral | ESSymbol | Void | Undefined | Null | Never | NonPrimitive,
/* @internal */
Primitive = String | Number | BigInt | Boolean | Enum | EnumLiteral | ESSymbol | Void | Undefined | Null | Literal | UniqueESSymbol,
StringLike = String | StringLiteral | TemplateLiteral,
StringLike = String | StringLiteral | TemplateLiteral | StringMapping,
NumberLike = Number | NumberLiteral | Enum,
BigIntLike = BigInt | BigIntLiteral,
BooleanLike = Boolean | BooleanLiteral,
@@ -4922,7 +4909,7 @@ namespace ts {
StructuredType = Object | Union | Intersection,
TypeVariable = TypeParameter | IndexedAccess,
InstantiableNonPrimitive = TypeVariable | Conditional | Substitution,
InstantiablePrimitive = Index | TemplateLiteral,
InstantiablePrimitive = Index | TemplateLiteral | StringMapping,
Instantiable = InstantiableNonPrimitive | InstantiablePrimitive,
StructuredOrInstantiable = StructuredType | Instantiable,
/* @internal */
@@ -4930,7 +4917,7 @@ namespace ts {
/* @internal */
Simplifiable = IndexedAccess | Conditional,
/* @internal */
Substructure = Object | Union | Intersection | Index | IndexedAccess | Conditional | Substitution | TemplateLiteral,
Substructure = Object | Union | Intersection | Index | IndexedAccess | Conditional | Substitution | TemplateLiteral | StringMapping,
// 'Narrowable' types are types where narrowing actually narrows.
// This *should* be every type other than null, undefined, void, and never
Narrowable = Any | Unknown | StructuredOrInstantiable | StringLike | NumberLike | BigIntLike | BooleanLike | ESSymbol | UniqueESSymbol | NonPrimitive,
@@ -5379,11 +5366,15 @@ namespace ts {
}
export interface TemplateLiteralType extends InstantiableType {
texts: readonly string[]; // Always one element longer than casings/types
casings: readonly TemplateCasing[]; // Always at least one element
texts: readonly string[]; // Always one element longer than types
types: readonly Type[]; // Always at least one element
}
export interface StringMappingType extends InstantiableType {
symbol: Symbol;
type: Type;
}
// Type parameter substitution (TypeFlags.Substitution)
// Substitution types are created for type parameters or indexed access types that occur in the
// true branch of a conditional type. For example, in 'T extends string ? Foo<T> : Bar<T>', the
@@ -6774,8 +6765,8 @@ namespace ts {
createIndexSignature(decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode): IndexSignatureDeclaration;
/* @internal */ createIndexSignature(decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined): IndexSignatureDeclaration; // eslint-disable-line @typescript-eslint/unified-signatures
updateIndexSignature(node: IndexSignatureDeclaration, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode): IndexSignatureDeclaration;
createTemplateLiteralTypeSpan(casing: TemplateCasing, type: TypeNode, literal: TemplateMiddle | TemplateTail): TemplateLiteralTypeSpan;
updateTemplateLiteralTypeSpan(casing: TemplateCasing, node: TemplateLiteralTypeSpan, type: TypeNode, literal: TemplateMiddle | TemplateTail): TemplateLiteralTypeSpan;
createTemplateLiteralTypeSpan(type: TypeNode, literal: TemplateMiddle | TemplateTail): TemplateLiteralTypeSpan;
updateTemplateLiteralTypeSpan(node: TemplateLiteralTypeSpan, type: TypeNode, literal: TemplateMiddle | TemplateTail): TemplateLiteralTypeSpan;
//
// Types
+4
View File
@@ -1065,6 +1065,10 @@ namespace FourSlashInterface {
typeEntry("ConstructorParameters"),
typeEntry("ReturnType"),
typeEntry("InstanceType"),
typeEntry("Uppercase"),
typeEntry("Lowercase"),
typeEntry("Capitalize"),
typeEntry("Uncapitalize"),
interfaceEntry("ThisType"),
varEntry("ArrayBuffer"),
interfaceEntry("ArrayBufferTypes"),
+20
View File
@@ -1508,6 +1508,26 @@ type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => i
*/
type InstanceType<T extends new (...args: any) => any> = T extends new (...args: any) => infer R ? R : any;
/**
* Convert string literal type to uppercase
*/
type Uppercase<S extends string> = intrinsic;
/**
* Convert string literal type to lowercase
*/
type Lowercase<S extends string> = intrinsic;
/**
* Convert first character of string literal type to uppercase
*/
type Capitalize<S extends string> = intrinsic;
/**
* Convert first character of string literal type to lowercase
*/
type Uncapitalize<S extends string> = intrinsic;
/**
* Marker for contextual 'this' type
*/
+231 -238
View File
@@ -240,215 +240,212 @@ declare namespace ts {
DeclareKeyword = 133,
GetKeyword = 134,
InferKeyword = 135,
IsKeyword = 136,
KeyOfKeyword = 137,
ModuleKeyword = 138,
NamespaceKeyword = 139,
NeverKeyword = 140,
ReadonlyKeyword = 141,
RequireKeyword = 142,
NumberKeyword = 143,
ObjectKeyword = 144,
SetKeyword = 145,
StringKeyword = 146,
SymbolKeyword = 147,
TypeKeyword = 148,
UndefinedKeyword = 149,
UniqueKeyword = 150,
UnknownKeyword = 151,
FromKeyword = 152,
GlobalKeyword = 153,
BigIntKeyword = 154,
UppercaseKeyword = 155,
LowercaseKeyword = 156,
CapitalizeKeyword = 157,
UncapitalizeKeyword = 158,
OfKeyword = 159,
QualifiedName = 160,
ComputedPropertyName = 161,
TypeParameter = 162,
Parameter = 163,
Decorator = 164,
PropertySignature = 165,
PropertyDeclaration = 166,
MethodSignature = 167,
MethodDeclaration = 168,
Constructor = 169,
GetAccessor = 170,
SetAccessor = 171,
CallSignature = 172,
ConstructSignature = 173,
IndexSignature = 174,
TypePredicate = 175,
TypeReference = 176,
FunctionType = 177,
ConstructorType = 178,
TypeQuery = 179,
TypeLiteral = 180,
ArrayType = 181,
TupleType = 182,
OptionalType = 183,
RestType = 184,
UnionType = 185,
IntersectionType = 186,
ConditionalType = 187,
InferType = 188,
ParenthesizedType = 189,
ThisType = 190,
TypeOperator = 191,
IndexedAccessType = 192,
MappedType = 193,
LiteralType = 194,
NamedTupleMember = 195,
TemplateLiteralType = 196,
TemplateLiteralTypeSpan = 197,
ImportType = 198,
ObjectBindingPattern = 199,
ArrayBindingPattern = 200,
BindingElement = 201,
ArrayLiteralExpression = 202,
ObjectLiteralExpression = 203,
PropertyAccessExpression = 204,
ElementAccessExpression = 205,
CallExpression = 206,
NewExpression = 207,
TaggedTemplateExpression = 208,
TypeAssertionExpression = 209,
ParenthesizedExpression = 210,
FunctionExpression = 211,
ArrowFunction = 212,
DeleteExpression = 213,
TypeOfExpression = 214,
VoidExpression = 215,
AwaitExpression = 216,
PrefixUnaryExpression = 217,
PostfixUnaryExpression = 218,
BinaryExpression = 219,
ConditionalExpression = 220,
TemplateExpression = 221,
YieldExpression = 222,
SpreadElement = 223,
ClassExpression = 224,
OmittedExpression = 225,
ExpressionWithTypeArguments = 226,
AsExpression = 227,
NonNullExpression = 228,
MetaProperty = 229,
SyntheticExpression = 230,
TemplateSpan = 231,
SemicolonClassElement = 232,
Block = 233,
EmptyStatement = 234,
VariableStatement = 235,
ExpressionStatement = 236,
IfStatement = 237,
DoStatement = 238,
WhileStatement = 239,
ForStatement = 240,
ForInStatement = 241,
ForOfStatement = 242,
ContinueStatement = 243,
BreakStatement = 244,
ReturnStatement = 245,
WithStatement = 246,
SwitchStatement = 247,
LabeledStatement = 248,
ThrowStatement = 249,
TryStatement = 250,
DebuggerStatement = 251,
VariableDeclaration = 252,
VariableDeclarationList = 253,
FunctionDeclaration = 254,
ClassDeclaration = 255,
InterfaceDeclaration = 256,
TypeAliasDeclaration = 257,
EnumDeclaration = 258,
ModuleDeclaration = 259,
ModuleBlock = 260,
CaseBlock = 261,
NamespaceExportDeclaration = 262,
ImportEqualsDeclaration = 263,
ImportDeclaration = 264,
ImportClause = 265,
NamespaceImport = 266,
NamedImports = 267,
ImportSpecifier = 268,
ExportAssignment = 269,
ExportDeclaration = 270,
NamedExports = 271,
NamespaceExport = 272,
ExportSpecifier = 273,
MissingDeclaration = 274,
ExternalModuleReference = 275,
JsxElement = 276,
JsxSelfClosingElement = 277,
JsxOpeningElement = 278,
JsxClosingElement = 279,
JsxFragment = 280,
JsxOpeningFragment = 281,
JsxClosingFragment = 282,
JsxAttribute = 283,
JsxAttributes = 284,
JsxSpreadAttribute = 285,
JsxExpression = 286,
CaseClause = 287,
DefaultClause = 288,
HeritageClause = 289,
CatchClause = 290,
PropertyAssignment = 291,
ShorthandPropertyAssignment = 292,
SpreadAssignment = 293,
EnumMember = 294,
UnparsedPrologue = 295,
UnparsedPrepend = 296,
UnparsedText = 297,
UnparsedInternalText = 298,
UnparsedSyntheticReference = 299,
SourceFile = 300,
Bundle = 301,
UnparsedSource = 302,
InputFiles = 303,
JSDocTypeExpression = 304,
JSDocNameReference = 305,
JSDocAllType = 306,
JSDocUnknownType = 307,
JSDocNullableType = 308,
JSDocNonNullableType = 309,
JSDocOptionalType = 310,
JSDocFunctionType = 311,
JSDocVariadicType = 312,
JSDocNamepathType = 313,
JSDocComment = 314,
JSDocTypeLiteral = 315,
JSDocSignature = 316,
JSDocTag = 317,
JSDocAugmentsTag = 318,
JSDocImplementsTag = 319,
JSDocAuthorTag = 320,
JSDocDeprecatedTag = 321,
JSDocClassTag = 322,
JSDocPublicTag = 323,
JSDocPrivateTag = 324,
JSDocProtectedTag = 325,
JSDocReadonlyTag = 326,
JSDocCallbackTag = 327,
JSDocEnumTag = 328,
JSDocParameterTag = 329,
JSDocReturnTag = 330,
JSDocThisTag = 331,
JSDocTypeTag = 332,
JSDocTemplateTag = 333,
JSDocTypedefTag = 334,
JSDocSeeTag = 335,
JSDocPropertyTag = 336,
SyntaxList = 337,
NotEmittedStatement = 338,
PartiallyEmittedExpression = 339,
CommaListExpression = 340,
MergeDeclarationMarker = 341,
EndOfDeclarationMarker = 342,
SyntheticReferenceExpression = 343,
Count = 344,
IntrinsicKeyword = 136,
IsKeyword = 137,
KeyOfKeyword = 138,
ModuleKeyword = 139,
NamespaceKeyword = 140,
NeverKeyword = 141,
ReadonlyKeyword = 142,
RequireKeyword = 143,
NumberKeyword = 144,
ObjectKeyword = 145,
SetKeyword = 146,
StringKeyword = 147,
SymbolKeyword = 148,
TypeKeyword = 149,
UndefinedKeyword = 150,
UniqueKeyword = 151,
UnknownKeyword = 152,
FromKeyword = 153,
GlobalKeyword = 154,
BigIntKeyword = 155,
OfKeyword = 156,
QualifiedName = 157,
ComputedPropertyName = 158,
TypeParameter = 159,
Parameter = 160,
Decorator = 161,
PropertySignature = 162,
PropertyDeclaration = 163,
MethodSignature = 164,
MethodDeclaration = 165,
Constructor = 166,
GetAccessor = 167,
SetAccessor = 168,
CallSignature = 169,
ConstructSignature = 170,
IndexSignature = 171,
TypePredicate = 172,
TypeReference = 173,
FunctionType = 174,
ConstructorType = 175,
TypeQuery = 176,
TypeLiteral = 177,
ArrayType = 178,
TupleType = 179,
OptionalType = 180,
RestType = 181,
UnionType = 182,
IntersectionType = 183,
ConditionalType = 184,
InferType = 185,
ParenthesizedType = 186,
ThisType = 187,
TypeOperator = 188,
IndexedAccessType = 189,
MappedType = 190,
LiteralType = 191,
NamedTupleMember = 192,
TemplateLiteralType = 193,
TemplateLiteralTypeSpan = 194,
ImportType = 195,
ObjectBindingPattern = 196,
ArrayBindingPattern = 197,
BindingElement = 198,
ArrayLiteralExpression = 199,
ObjectLiteralExpression = 200,
PropertyAccessExpression = 201,
ElementAccessExpression = 202,
CallExpression = 203,
NewExpression = 204,
TaggedTemplateExpression = 205,
TypeAssertionExpression = 206,
ParenthesizedExpression = 207,
FunctionExpression = 208,
ArrowFunction = 209,
DeleteExpression = 210,
TypeOfExpression = 211,
VoidExpression = 212,
AwaitExpression = 213,
PrefixUnaryExpression = 214,
PostfixUnaryExpression = 215,
BinaryExpression = 216,
ConditionalExpression = 217,
TemplateExpression = 218,
YieldExpression = 219,
SpreadElement = 220,
ClassExpression = 221,
OmittedExpression = 222,
ExpressionWithTypeArguments = 223,
AsExpression = 224,
NonNullExpression = 225,
MetaProperty = 226,
SyntheticExpression = 227,
TemplateSpan = 228,
SemicolonClassElement = 229,
Block = 230,
EmptyStatement = 231,
VariableStatement = 232,
ExpressionStatement = 233,
IfStatement = 234,
DoStatement = 235,
WhileStatement = 236,
ForStatement = 237,
ForInStatement = 238,
ForOfStatement = 239,
ContinueStatement = 240,
BreakStatement = 241,
ReturnStatement = 242,
WithStatement = 243,
SwitchStatement = 244,
LabeledStatement = 245,
ThrowStatement = 246,
TryStatement = 247,
DebuggerStatement = 248,
VariableDeclaration = 249,
VariableDeclarationList = 250,
FunctionDeclaration = 251,
ClassDeclaration = 252,
InterfaceDeclaration = 253,
TypeAliasDeclaration = 254,
EnumDeclaration = 255,
ModuleDeclaration = 256,
ModuleBlock = 257,
CaseBlock = 258,
NamespaceExportDeclaration = 259,
ImportEqualsDeclaration = 260,
ImportDeclaration = 261,
ImportClause = 262,
NamespaceImport = 263,
NamedImports = 264,
ImportSpecifier = 265,
ExportAssignment = 266,
ExportDeclaration = 267,
NamedExports = 268,
NamespaceExport = 269,
ExportSpecifier = 270,
MissingDeclaration = 271,
ExternalModuleReference = 272,
JsxElement = 273,
JsxSelfClosingElement = 274,
JsxOpeningElement = 275,
JsxClosingElement = 276,
JsxFragment = 277,
JsxOpeningFragment = 278,
JsxClosingFragment = 279,
JsxAttribute = 280,
JsxAttributes = 281,
JsxSpreadAttribute = 282,
JsxExpression = 283,
CaseClause = 284,
DefaultClause = 285,
HeritageClause = 286,
CatchClause = 287,
PropertyAssignment = 288,
ShorthandPropertyAssignment = 289,
SpreadAssignment = 290,
EnumMember = 291,
UnparsedPrologue = 292,
UnparsedPrepend = 293,
UnparsedText = 294,
UnparsedInternalText = 295,
UnparsedSyntheticReference = 296,
SourceFile = 297,
Bundle = 298,
UnparsedSource = 299,
InputFiles = 300,
JSDocTypeExpression = 301,
JSDocNameReference = 302,
JSDocAllType = 303,
JSDocUnknownType = 304,
JSDocNullableType = 305,
JSDocNonNullableType = 306,
JSDocOptionalType = 307,
JSDocFunctionType = 308,
JSDocVariadicType = 309,
JSDocNamepathType = 310,
JSDocComment = 311,
JSDocTypeLiteral = 312,
JSDocSignature = 313,
JSDocTag = 314,
JSDocAugmentsTag = 315,
JSDocImplementsTag = 316,
JSDocAuthorTag = 317,
JSDocDeprecatedTag = 318,
JSDocClassTag = 319,
JSDocPublicTag = 320,
JSDocPrivateTag = 321,
JSDocProtectedTag = 322,
JSDocReadonlyTag = 323,
JSDocCallbackTag = 324,
JSDocEnumTag = 325,
JSDocParameterTag = 326,
JSDocReturnTag = 327,
JSDocThisTag = 328,
JSDocTypeTag = 329,
JSDocTemplateTag = 330,
JSDocTypedefTag = 331,
JSDocSeeTag = 332,
JSDocPropertyTag = 333,
SyntaxList = 334,
NotEmittedStatement = 335,
PartiallyEmittedExpression = 336,
CommaListExpression = 337,
MergeDeclarationMarker = 338,
EndOfDeclarationMarker = 339,
SyntheticReferenceExpression = 340,
Count = 341,
FirstAssignment = 62,
LastAssignment = 77,
FirstCompoundAssignment = 63,
@@ -456,15 +453,15 @@ declare namespace ts {
FirstReservedWord = 80,
LastReservedWord = 115,
FirstKeyword = 80,
LastKeyword = 159,
LastKeyword = 156,
FirstFutureReservedWord = 116,
LastFutureReservedWord = 124,
FirstTypeNode = 175,
LastTypeNode = 198,
FirstTypeNode = 172,
LastTypeNode = 195,
FirstPunctuation = 18,
LastPunctuation = 77,
FirstToken = 0,
LastToken = 159,
LastToken = 156,
FirstTriviaToken = 2,
LastTriviaToken = 7,
FirstLiteralToken = 8,
@@ -473,21 +470,21 @@ declare namespace ts {
LastTemplateToken = 17,
FirstBinaryOperator = 29,
LastBinaryOperator = 77,
FirstStatement = 235,
LastStatement = 251,
FirstNode = 160,
FirstJSDocNode = 304,
LastJSDocNode = 336,
FirstJSDocTagNode = 317,
LastJSDocTagNode = 336,
FirstStatement = 232,
LastStatement = 248,
FirstNode = 157,
FirstJSDocNode = 301,
LastJSDocNode = 333,
FirstJSDocTagNode = 314,
LastJSDocTagNode = 333,
}
export type TriviaSyntaxKind = SyntaxKind.SingleLineCommentTrivia | SyntaxKind.MultiLineCommentTrivia | SyntaxKind.NewLineTrivia | SyntaxKind.WhitespaceTrivia | SyntaxKind.ShebangTrivia | SyntaxKind.ConflictMarkerTrivia;
export type LiteralSyntaxKind = SyntaxKind.NumericLiteral | SyntaxKind.BigIntLiteral | SyntaxKind.StringLiteral | SyntaxKind.JsxText | SyntaxKind.JsxTextAllWhiteSpaces | SyntaxKind.RegularExpressionLiteral | SyntaxKind.NoSubstitutionTemplateLiteral;
export type PseudoLiteralSyntaxKind = SyntaxKind.TemplateHead | SyntaxKind.TemplateMiddle | SyntaxKind.TemplateTail;
export type PunctuationSyntaxKind = SyntaxKind.OpenBraceToken | SyntaxKind.CloseBraceToken | SyntaxKind.OpenParenToken | SyntaxKind.CloseParenToken | SyntaxKind.OpenBracketToken | SyntaxKind.CloseBracketToken | SyntaxKind.DotToken | SyntaxKind.DotDotDotToken | SyntaxKind.SemicolonToken | SyntaxKind.CommaToken | SyntaxKind.QuestionDotToken | SyntaxKind.LessThanToken | SyntaxKind.LessThanSlashToken | SyntaxKind.GreaterThanToken | SyntaxKind.LessThanEqualsToken | SyntaxKind.GreaterThanEqualsToken | SyntaxKind.EqualsEqualsToken | SyntaxKind.ExclamationEqualsToken | SyntaxKind.EqualsEqualsEqualsToken | SyntaxKind.ExclamationEqualsEqualsToken | SyntaxKind.EqualsGreaterThanToken | SyntaxKind.PlusToken | SyntaxKind.MinusToken | SyntaxKind.AsteriskToken | SyntaxKind.AsteriskAsteriskToken | SyntaxKind.SlashToken | SyntaxKind.PercentToken | SyntaxKind.PlusPlusToken | SyntaxKind.MinusMinusToken | SyntaxKind.LessThanLessThanToken | SyntaxKind.GreaterThanGreaterThanToken | SyntaxKind.GreaterThanGreaterThanGreaterThanToken | SyntaxKind.AmpersandToken | SyntaxKind.BarToken | SyntaxKind.CaretToken | SyntaxKind.ExclamationToken | SyntaxKind.TildeToken | SyntaxKind.AmpersandAmpersandToken | SyntaxKind.BarBarToken | SyntaxKind.QuestionQuestionToken | SyntaxKind.QuestionToken | SyntaxKind.ColonToken | SyntaxKind.AtToken | SyntaxKind.BacktickToken | SyntaxKind.EqualsToken | SyntaxKind.PlusEqualsToken | SyntaxKind.MinusEqualsToken | SyntaxKind.AsteriskEqualsToken | SyntaxKind.AsteriskAsteriskEqualsToken | SyntaxKind.SlashEqualsToken | SyntaxKind.PercentEqualsToken | SyntaxKind.LessThanLessThanEqualsToken | SyntaxKind.GreaterThanGreaterThanEqualsToken | SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken | SyntaxKind.AmpersandEqualsToken | SyntaxKind.BarEqualsToken | SyntaxKind.CaretEqualsToken;
export type KeywordSyntaxKind = SyntaxKind.AbstractKeyword | SyntaxKind.AnyKeyword | SyntaxKind.AsKeyword | SyntaxKind.AssertsKeyword | SyntaxKind.AsyncKeyword | SyntaxKind.AwaitKeyword | SyntaxKind.BigIntKeyword | SyntaxKind.BooleanKeyword | SyntaxKind.BreakKeyword | SyntaxKind.CapitalizeKeyword | SyntaxKind.CaseKeyword | SyntaxKind.CatchKeyword | SyntaxKind.ClassKeyword | SyntaxKind.ConstKeyword | SyntaxKind.ConstructorKeyword | SyntaxKind.ContinueKeyword | SyntaxKind.DebuggerKeyword | SyntaxKind.DeclareKeyword | SyntaxKind.DefaultKeyword | SyntaxKind.DeleteKeyword | SyntaxKind.DoKeyword | SyntaxKind.ElseKeyword | SyntaxKind.EnumKeyword | SyntaxKind.ExportKeyword | SyntaxKind.ExtendsKeyword | SyntaxKind.FalseKeyword | SyntaxKind.FinallyKeyword | SyntaxKind.ForKeyword | SyntaxKind.FromKeyword | SyntaxKind.FunctionKeyword | SyntaxKind.GetKeyword | SyntaxKind.GlobalKeyword | SyntaxKind.IfKeyword | SyntaxKind.ImplementsKeyword | SyntaxKind.ImportKeyword | SyntaxKind.InferKeyword | SyntaxKind.InKeyword | SyntaxKind.InstanceOfKeyword | SyntaxKind.InterfaceKeyword | SyntaxKind.IsKeyword | SyntaxKind.KeyOfKeyword | SyntaxKind.LetKeyword | SyntaxKind.LowercaseKeyword | SyntaxKind.ModuleKeyword | SyntaxKind.NamespaceKeyword | SyntaxKind.NeverKeyword | SyntaxKind.NewKeyword | SyntaxKind.NullKeyword | SyntaxKind.NumberKeyword | SyntaxKind.ObjectKeyword | SyntaxKind.OfKeyword | SyntaxKind.PackageKeyword | SyntaxKind.PrivateKeyword | SyntaxKind.ProtectedKeyword | SyntaxKind.PublicKeyword | SyntaxKind.ReadonlyKeyword | SyntaxKind.RequireKeyword | SyntaxKind.ReturnKeyword | SyntaxKind.SetKeyword | SyntaxKind.StaticKeyword | SyntaxKind.StringKeyword | SyntaxKind.SuperKeyword | SyntaxKind.SwitchKeyword | SyntaxKind.SymbolKeyword | SyntaxKind.ThisKeyword | SyntaxKind.ThrowKeyword | SyntaxKind.TrueKeyword | SyntaxKind.TryKeyword | SyntaxKind.TypeKeyword | SyntaxKind.TypeOfKeyword | SyntaxKind.UncapitalizeKeyword | SyntaxKind.UndefinedKeyword | SyntaxKind.UniqueKeyword | SyntaxKind.UnknownKeyword | SyntaxKind.UppercaseKeyword | SyntaxKind.VarKeyword | SyntaxKind.VoidKeyword | SyntaxKind.WhileKeyword | SyntaxKind.WithKeyword | SyntaxKind.YieldKeyword;
export type KeywordSyntaxKind = SyntaxKind.AbstractKeyword | SyntaxKind.AnyKeyword | SyntaxKind.AsKeyword | SyntaxKind.AssertsKeyword | SyntaxKind.AsyncKeyword | SyntaxKind.AwaitKeyword | SyntaxKind.BigIntKeyword | SyntaxKind.BooleanKeyword | SyntaxKind.BreakKeyword | SyntaxKind.CaseKeyword | SyntaxKind.CatchKeyword | SyntaxKind.ClassKeyword | SyntaxKind.ConstKeyword | SyntaxKind.ConstructorKeyword | SyntaxKind.ContinueKeyword | SyntaxKind.DebuggerKeyword | SyntaxKind.DeclareKeyword | SyntaxKind.DefaultKeyword | SyntaxKind.DeleteKeyword | SyntaxKind.DoKeyword | SyntaxKind.ElseKeyword | SyntaxKind.EnumKeyword | SyntaxKind.ExportKeyword | SyntaxKind.ExtendsKeyword | SyntaxKind.FalseKeyword | SyntaxKind.FinallyKeyword | SyntaxKind.ForKeyword | SyntaxKind.FromKeyword | SyntaxKind.FunctionKeyword | SyntaxKind.GetKeyword | SyntaxKind.GlobalKeyword | SyntaxKind.IfKeyword | SyntaxKind.ImplementsKeyword | SyntaxKind.ImportKeyword | SyntaxKind.InferKeyword | SyntaxKind.InKeyword | SyntaxKind.InstanceOfKeyword | SyntaxKind.InterfaceKeyword | SyntaxKind.IntrinsicKeyword | SyntaxKind.IsKeyword | SyntaxKind.KeyOfKeyword | SyntaxKind.LetKeyword | SyntaxKind.ModuleKeyword | SyntaxKind.NamespaceKeyword | SyntaxKind.NeverKeyword | SyntaxKind.NewKeyword | SyntaxKind.NullKeyword | SyntaxKind.NumberKeyword | SyntaxKind.ObjectKeyword | SyntaxKind.OfKeyword | SyntaxKind.PackageKeyword | SyntaxKind.PrivateKeyword | SyntaxKind.ProtectedKeyword | SyntaxKind.PublicKeyword | SyntaxKind.ReadonlyKeyword | SyntaxKind.RequireKeyword | SyntaxKind.ReturnKeyword | SyntaxKind.SetKeyword | SyntaxKind.StaticKeyword | SyntaxKind.StringKeyword | SyntaxKind.SuperKeyword | SyntaxKind.SwitchKeyword | SyntaxKind.SymbolKeyword | SyntaxKind.ThisKeyword | SyntaxKind.ThrowKeyword | SyntaxKind.TrueKeyword | SyntaxKind.TryKeyword | SyntaxKind.TypeKeyword | SyntaxKind.TypeOfKeyword | SyntaxKind.UndefinedKeyword | SyntaxKind.UniqueKeyword | SyntaxKind.UnknownKeyword | SyntaxKind.VarKeyword | SyntaxKind.VoidKeyword | SyntaxKind.WhileKeyword | SyntaxKind.WithKeyword | SyntaxKind.YieldKeyword;
export type ModifierSyntaxKind = SyntaxKind.AbstractKeyword | SyntaxKind.AsyncKeyword | SyntaxKind.ConstKeyword | SyntaxKind.DeclareKeyword | SyntaxKind.DefaultKeyword | SyntaxKind.ExportKeyword | SyntaxKind.PrivateKeyword | SyntaxKind.ProtectedKeyword | SyntaxKind.PublicKeyword | SyntaxKind.ReadonlyKeyword | SyntaxKind.StaticKeyword;
export type KeywordTypeSyntaxKind = SyntaxKind.AnyKeyword | SyntaxKind.BigIntKeyword | SyntaxKind.BooleanKeyword | SyntaxKind.NeverKeyword | SyntaxKind.NumberKeyword | SyntaxKind.ObjectKeyword | SyntaxKind.StringKeyword | SyntaxKind.SymbolKeyword | SyntaxKind.UndefinedKeyword | SyntaxKind.UnknownKeyword | SyntaxKind.VoidKeyword;
export type KeywordTypeSyntaxKind = SyntaxKind.AnyKeyword | SyntaxKind.BigIntKeyword | SyntaxKind.BooleanKeyword | SyntaxKind.IntrinsicKeyword | SyntaxKind.NeverKeyword | SyntaxKind.NumberKeyword | SyntaxKind.ObjectKeyword | SyntaxKind.StringKeyword | SyntaxKind.SymbolKeyword | SyntaxKind.UndefinedKeyword | SyntaxKind.UnknownKeyword | SyntaxKind.VoidKeyword;
export type TokenSyntaxKind = SyntaxKind.Unknown | SyntaxKind.EndOfFileToken | TriviaSyntaxKind | LiteralSyntaxKind | PseudoLiteralSyntaxKind | PunctuationSyntaxKind | SyntaxKind.Identifier | KeywordSyntaxKind;
export type JsxTokenSyntaxKind = SyntaxKind.LessThanSlashToken | SyntaxKind.EndOfFileToken | SyntaxKind.ConflictMarkerTrivia | SyntaxKind.JsxText | SyntaxKind.JsxTextAllWhiteSpaces | SyntaxKind.OpenBraceToken | SyntaxKind.LessThanToken;
export type JSDocSyntaxKind = SyntaxKind.EndOfFileToken | SyntaxKind.WhitespaceTrivia | SyntaxKind.AtToken | SyntaxKind.NewLineTrivia | SyntaxKind.AsteriskToken | SyntaxKind.OpenBraceToken | SyntaxKind.CloseBraceToken | SyntaxKind.LessThanToken | SyntaxKind.GreaterThanToken | SyntaxKind.OpenBracketToken | SyntaxKind.CloseBracketToken | SyntaxKind.EqualsToken | SyntaxKind.CommaToken | SyntaxKind.DotToken | SyntaxKind.Identifier | SyntaxKind.BacktickToken | SyntaxKind.Unknown | KeywordSyntaxKind;
@@ -972,17 +969,9 @@ declare namespace ts {
export interface TemplateLiteralTypeSpan extends TypeNode {
readonly kind: SyntaxKind.TemplateLiteralTypeSpan;
readonly parent: TemplateLiteralTypeNode;
readonly casing: TemplateCasing;
readonly type: TypeNode;
readonly literal: TemplateMiddle | TemplateTail;
}
export enum TemplateCasing {
None = 0,
Uppercase = 1,
Lowercase = 2,
Capitalize = 3,
Uncapitalize = 4
}
export interface Expression extends Node {
_expressionBrand: any;
}
@@ -2489,11 +2478,12 @@ declare namespace ts {
Substitution = 33554432,
NonPrimitive = 67108864,
TemplateLiteral = 134217728,
StringMapping = 268435456,
Literal = 2944,
Unit = 109440,
StringOrNumberLiteral = 384,
PossiblyFalsy = 117724,
StringLike = 134217860,
StringLike = 402653316,
NumberLike = 296,
BigIntLike = 2112,
BooleanLike = 528,
@@ -2504,10 +2494,10 @@ declare namespace ts {
StructuredType = 3670016,
TypeVariable = 8650752,
InstantiableNonPrimitive = 58982400,
InstantiablePrimitive = 138412032,
Instantiable = 197394432,
StructuredOrInstantiable = 201064448,
Narrowable = 268188671,
InstantiablePrimitive = 406847488,
Instantiable = 465829888,
StructuredOrInstantiable = 469499904,
Narrowable = 536624127,
}
export type DestructuringPattern = BindingPattern | ObjectLiteralExpression | ArrayLiteralExpression;
export interface Type {
@@ -2660,9 +2650,12 @@ declare namespace ts {
}
export interface TemplateLiteralType extends InstantiableType {
texts: readonly string[];
casings: readonly TemplateCasing[];
types: readonly Type[];
}
export interface StringMappingType extends InstantiableType {
symbol: Symbol;
type: Type;
}
export interface SubstitutionType extends InstantiableType {
baseType: Type;
substitute: Type;
@@ -3225,8 +3218,8 @@ declare namespace ts {
updateConstructSignature(node: ConstructSignatureDeclaration, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined): ConstructSignatureDeclaration;
createIndexSignature(decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode): IndexSignatureDeclaration;
updateIndexSignature(node: IndexSignatureDeclaration, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode): IndexSignatureDeclaration;
createTemplateLiteralTypeSpan(casing: TemplateCasing, type: TypeNode, literal: TemplateMiddle | TemplateTail): TemplateLiteralTypeSpan;
updateTemplateLiteralTypeSpan(casing: TemplateCasing, node: TemplateLiteralTypeSpan, type: TypeNode, literal: TemplateMiddle | TemplateTail): TemplateLiteralTypeSpan;
createTemplateLiteralTypeSpan(type: TypeNode, literal: TemplateMiddle | TemplateTail): TemplateLiteralTypeSpan;
updateTemplateLiteralTypeSpan(node: TemplateLiteralTypeSpan, type: TypeNode, literal: TemplateMiddle | TemplateTail): TemplateLiteralTypeSpan;
createKeywordTypeNode<TKind extends KeywordTypeSyntaxKind>(kind: TKind): KeywordTypeNode<TKind>;
createTypePredicateNode(assertsModifier: AssertsKeyword | undefined, parameterName: Identifier | ThisTypeNode | string, type: TypeNode | undefined): TypePredicateNode;
updateTypePredicateNode(node: TypePredicateNode, assertsModifier: AssertsKeyword | undefined, parameterName: Identifier | ThisTypeNode, type: TypeNode | undefined): TypePredicateNode;
+231 -238
View File
@@ -240,215 +240,212 @@ declare namespace ts {
DeclareKeyword = 133,
GetKeyword = 134,
InferKeyword = 135,
IsKeyword = 136,
KeyOfKeyword = 137,
ModuleKeyword = 138,
NamespaceKeyword = 139,
NeverKeyword = 140,
ReadonlyKeyword = 141,
RequireKeyword = 142,
NumberKeyword = 143,
ObjectKeyword = 144,
SetKeyword = 145,
StringKeyword = 146,
SymbolKeyword = 147,
TypeKeyword = 148,
UndefinedKeyword = 149,
UniqueKeyword = 150,
UnknownKeyword = 151,
FromKeyword = 152,
GlobalKeyword = 153,
BigIntKeyword = 154,
UppercaseKeyword = 155,
LowercaseKeyword = 156,
CapitalizeKeyword = 157,
UncapitalizeKeyword = 158,
OfKeyword = 159,
QualifiedName = 160,
ComputedPropertyName = 161,
TypeParameter = 162,
Parameter = 163,
Decorator = 164,
PropertySignature = 165,
PropertyDeclaration = 166,
MethodSignature = 167,
MethodDeclaration = 168,
Constructor = 169,
GetAccessor = 170,
SetAccessor = 171,
CallSignature = 172,
ConstructSignature = 173,
IndexSignature = 174,
TypePredicate = 175,
TypeReference = 176,
FunctionType = 177,
ConstructorType = 178,
TypeQuery = 179,
TypeLiteral = 180,
ArrayType = 181,
TupleType = 182,
OptionalType = 183,
RestType = 184,
UnionType = 185,
IntersectionType = 186,
ConditionalType = 187,
InferType = 188,
ParenthesizedType = 189,
ThisType = 190,
TypeOperator = 191,
IndexedAccessType = 192,
MappedType = 193,
LiteralType = 194,
NamedTupleMember = 195,
TemplateLiteralType = 196,
TemplateLiteralTypeSpan = 197,
ImportType = 198,
ObjectBindingPattern = 199,
ArrayBindingPattern = 200,
BindingElement = 201,
ArrayLiteralExpression = 202,
ObjectLiteralExpression = 203,
PropertyAccessExpression = 204,
ElementAccessExpression = 205,
CallExpression = 206,
NewExpression = 207,
TaggedTemplateExpression = 208,
TypeAssertionExpression = 209,
ParenthesizedExpression = 210,
FunctionExpression = 211,
ArrowFunction = 212,
DeleteExpression = 213,
TypeOfExpression = 214,
VoidExpression = 215,
AwaitExpression = 216,
PrefixUnaryExpression = 217,
PostfixUnaryExpression = 218,
BinaryExpression = 219,
ConditionalExpression = 220,
TemplateExpression = 221,
YieldExpression = 222,
SpreadElement = 223,
ClassExpression = 224,
OmittedExpression = 225,
ExpressionWithTypeArguments = 226,
AsExpression = 227,
NonNullExpression = 228,
MetaProperty = 229,
SyntheticExpression = 230,
TemplateSpan = 231,
SemicolonClassElement = 232,
Block = 233,
EmptyStatement = 234,
VariableStatement = 235,
ExpressionStatement = 236,
IfStatement = 237,
DoStatement = 238,
WhileStatement = 239,
ForStatement = 240,
ForInStatement = 241,
ForOfStatement = 242,
ContinueStatement = 243,
BreakStatement = 244,
ReturnStatement = 245,
WithStatement = 246,
SwitchStatement = 247,
LabeledStatement = 248,
ThrowStatement = 249,
TryStatement = 250,
DebuggerStatement = 251,
VariableDeclaration = 252,
VariableDeclarationList = 253,
FunctionDeclaration = 254,
ClassDeclaration = 255,
InterfaceDeclaration = 256,
TypeAliasDeclaration = 257,
EnumDeclaration = 258,
ModuleDeclaration = 259,
ModuleBlock = 260,
CaseBlock = 261,
NamespaceExportDeclaration = 262,
ImportEqualsDeclaration = 263,
ImportDeclaration = 264,
ImportClause = 265,
NamespaceImport = 266,
NamedImports = 267,
ImportSpecifier = 268,
ExportAssignment = 269,
ExportDeclaration = 270,
NamedExports = 271,
NamespaceExport = 272,
ExportSpecifier = 273,
MissingDeclaration = 274,
ExternalModuleReference = 275,
JsxElement = 276,
JsxSelfClosingElement = 277,
JsxOpeningElement = 278,
JsxClosingElement = 279,
JsxFragment = 280,
JsxOpeningFragment = 281,
JsxClosingFragment = 282,
JsxAttribute = 283,
JsxAttributes = 284,
JsxSpreadAttribute = 285,
JsxExpression = 286,
CaseClause = 287,
DefaultClause = 288,
HeritageClause = 289,
CatchClause = 290,
PropertyAssignment = 291,
ShorthandPropertyAssignment = 292,
SpreadAssignment = 293,
EnumMember = 294,
UnparsedPrologue = 295,
UnparsedPrepend = 296,
UnparsedText = 297,
UnparsedInternalText = 298,
UnparsedSyntheticReference = 299,
SourceFile = 300,
Bundle = 301,
UnparsedSource = 302,
InputFiles = 303,
JSDocTypeExpression = 304,
JSDocNameReference = 305,
JSDocAllType = 306,
JSDocUnknownType = 307,
JSDocNullableType = 308,
JSDocNonNullableType = 309,
JSDocOptionalType = 310,
JSDocFunctionType = 311,
JSDocVariadicType = 312,
JSDocNamepathType = 313,
JSDocComment = 314,
JSDocTypeLiteral = 315,
JSDocSignature = 316,
JSDocTag = 317,
JSDocAugmentsTag = 318,
JSDocImplementsTag = 319,
JSDocAuthorTag = 320,
JSDocDeprecatedTag = 321,
JSDocClassTag = 322,
JSDocPublicTag = 323,
JSDocPrivateTag = 324,
JSDocProtectedTag = 325,
JSDocReadonlyTag = 326,
JSDocCallbackTag = 327,
JSDocEnumTag = 328,
JSDocParameterTag = 329,
JSDocReturnTag = 330,
JSDocThisTag = 331,
JSDocTypeTag = 332,
JSDocTemplateTag = 333,
JSDocTypedefTag = 334,
JSDocSeeTag = 335,
JSDocPropertyTag = 336,
SyntaxList = 337,
NotEmittedStatement = 338,
PartiallyEmittedExpression = 339,
CommaListExpression = 340,
MergeDeclarationMarker = 341,
EndOfDeclarationMarker = 342,
SyntheticReferenceExpression = 343,
Count = 344,
IntrinsicKeyword = 136,
IsKeyword = 137,
KeyOfKeyword = 138,
ModuleKeyword = 139,
NamespaceKeyword = 140,
NeverKeyword = 141,
ReadonlyKeyword = 142,
RequireKeyword = 143,
NumberKeyword = 144,
ObjectKeyword = 145,
SetKeyword = 146,
StringKeyword = 147,
SymbolKeyword = 148,
TypeKeyword = 149,
UndefinedKeyword = 150,
UniqueKeyword = 151,
UnknownKeyword = 152,
FromKeyword = 153,
GlobalKeyword = 154,
BigIntKeyword = 155,
OfKeyword = 156,
QualifiedName = 157,
ComputedPropertyName = 158,
TypeParameter = 159,
Parameter = 160,
Decorator = 161,
PropertySignature = 162,
PropertyDeclaration = 163,
MethodSignature = 164,
MethodDeclaration = 165,
Constructor = 166,
GetAccessor = 167,
SetAccessor = 168,
CallSignature = 169,
ConstructSignature = 170,
IndexSignature = 171,
TypePredicate = 172,
TypeReference = 173,
FunctionType = 174,
ConstructorType = 175,
TypeQuery = 176,
TypeLiteral = 177,
ArrayType = 178,
TupleType = 179,
OptionalType = 180,
RestType = 181,
UnionType = 182,
IntersectionType = 183,
ConditionalType = 184,
InferType = 185,
ParenthesizedType = 186,
ThisType = 187,
TypeOperator = 188,
IndexedAccessType = 189,
MappedType = 190,
LiteralType = 191,
NamedTupleMember = 192,
TemplateLiteralType = 193,
TemplateLiteralTypeSpan = 194,
ImportType = 195,
ObjectBindingPattern = 196,
ArrayBindingPattern = 197,
BindingElement = 198,
ArrayLiteralExpression = 199,
ObjectLiteralExpression = 200,
PropertyAccessExpression = 201,
ElementAccessExpression = 202,
CallExpression = 203,
NewExpression = 204,
TaggedTemplateExpression = 205,
TypeAssertionExpression = 206,
ParenthesizedExpression = 207,
FunctionExpression = 208,
ArrowFunction = 209,
DeleteExpression = 210,
TypeOfExpression = 211,
VoidExpression = 212,
AwaitExpression = 213,
PrefixUnaryExpression = 214,
PostfixUnaryExpression = 215,
BinaryExpression = 216,
ConditionalExpression = 217,
TemplateExpression = 218,
YieldExpression = 219,
SpreadElement = 220,
ClassExpression = 221,
OmittedExpression = 222,
ExpressionWithTypeArguments = 223,
AsExpression = 224,
NonNullExpression = 225,
MetaProperty = 226,
SyntheticExpression = 227,
TemplateSpan = 228,
SemicolonClassElement = 229,
Block = 230,
EmptyStatement = 231,
VariableStatement = 232,
ExpressionStatement = 233,
IfStatement = 234,
DoStatement = 235,
WhileStatement = 236,
ForStatement = 237,
ForInStatement = 238,
ForOfStatement = 239,
ContinueStatement = 240,
BreakStatement = 241,
ReturnStatement = 242,
WithStatement = 243,
SwitchStatement = 244,
LabeledStatement = 245,
ThrowStatement = 246,
TryStatement = 247,
DebuggerStatement = 248,
VariableDeclaration = 249,
VariableDeclarationList = 250,
FunctionDeclaration = 251,
ClassDeclaration = 252,
InterfaceDeclaration = 253,
TypeAliasDeclaration = 254,
EnumDeclaration = 255,
ModuleDeclaration = 256,
ModuleBlock = 257,
CaseBlock = 258,
NamespaceExportDeclaration = 259,
ImportEqualsDeclaration = 260,
ImportDeclaration = 261,
ImportClause = 262,
NamespaceImport = 263,
NamedImports = 264,
ImportSpecifier = 265,
ExportAssignment = 266,
ExportDeclaration = 267,
NamedExports = 268,
NamespaceExport = 269,
ExportSpecifier = 270,
MissingDeclaration = 271,
ExternalModuleReference = 272,
JsxElement = 273,
JsxSelfClosingElement = 274,
JsxOpeningElement = 275,
JsxClosingElement = 276,
JsxFragment = 277,
JsxOpeningFragment = 278,
JsxClosingFragment = 279,
JsxAttribute = 280,
JsxAttributes = 281,
JsxSpreadAttribute = 282,
JsxExpression = 283,
CaseClause = 284,
DefaultClause = 285,
HeritageClause = 286,
CatchClause = 287,
PropertyAssignment = 288,
ShorthandPropertyAssignment = 289,
SpreadAssignment = 290,
EnumMember = 291,
UnparsedPrologue = 292,
UnparsedPrepend = 293,
UnparsedText = 294,
UnparsedInternalText = 295,
UnparsedSyntheticReference = 296,
SourceFile = 297,
Bundle = 298,
UnparsedSource = 299,
InputFiles = 300,
JSDocTypeExpression = 301,
JSDocNameReference = 302,
JSDocAllType = 303,
JSDocUnknownType = 304,
JSDocNullableType = 305,
JSDocNonNullableType = 306,
JSDocOptionalType = 307,
JSDocFunctionType = 308,
JSDocVariadicType = 309,
JSDocNamepathType = 310,
JSDocComment = 311,
JSDocTypeLiteral = 312,
JSDocSignature = 313,
JSDocTag = 314,
JSDocAugmentsTag = 315,
JSDocImplementsTag = 316,
JSDocAuthorTag = 317,
JSDocDeprecatedTag = 318,
JSDocClassTag = 319,
JSDocPublicTag = 320,
JSDocPrivateTag = 321,
JSDocProtectedTag = 322,
JSDocReadonlyTag = 323,
JSDocCallbackTag = 324,
JSDocEnumTag = 325,
JSDocParameterTag = 326,
JSDocReturnTag = 327,
JSDocThisTag = 328,
JSDocTypeTag = 329,
JSDocTemplateTag = 330,
JSDocTypedefTag = 331,
JSDocSeeTag = 332,
JSDocPropertyTag = 333,
SyntaxList = 334,
NotEmittedStatement = 335,
PartiallyEmittedExpression = 336,
CommaListExpression = 337,
MergeDeclarationMarker = 338,
EndOfDeclarationMarker = 339,
SyntheticReferenceExpression = 340,
Count = 341,
FirstAssignment = 62,
LastAssignment = 77,
FirstCompoundAssignment = 63,
@@ -456,15 +453,15 @@ declare namespace ts {
FirstReservedWord = 80,
LastReservedWord = 115,
FirstKeyword = 80,
LastKeyword = 159,
LastKeyword = 156,
FirstFutureReservedWord = 116,
LastFutureReservedWord = 124,
FirstTypeNode = 175,
LastTypeNode = 198,
FirstTypeNode = 172,
LastTypeNode = 195,
FirstPunctuation = 18,
LastPunctuation = 77,
FirstToken = 0,
LastToken = 159,
LastToken = 156,
FirstTriviaToken = 2,
LastTriviaToken = 7,
FirstLiteralToken = 8,
@@ -473,21 +470,21 @@ declare namespace ts {
LastTemplateToken = 17,
FirstBinaryOperator = 29,
LastBinaryOperator = 77,
FirstStatement = 235,
LastStatement = 251,
FirstNode = 160,
FirstJSDocNode = 304,
LastJSDocNode = 336,
FirstJSDocTagNode = 317,
LastJSDocTagNode = 336,
FirstStatement = 232,
LastStatement = 248,
FirstNode = 157,
FirstJSDocNode = 301,
LastJSDocNode = 333,
FirstJSDocTagNode = 314,
LastJSDocTagNode = 333,
}
export type TriviaSyntaxKind = SyntaxKind.SingleLineCommentTrivia | SyntaxKind.MultiLineCommentTrivia | SyntaxKind.NewLineTrivia | SyntaxKind.WhitespaceTrivia | SyntaxKind.ShebangTrivia | SyntaxKind.ConflictMarkerTrivia;
export type LiteralSyntaxKind = SyntaxKind.NumericLiteral | SyntaxKind.BigIntLiteral | SyntaxKind.StringLiteral | SyntaxKind.JsxText | SyntaxKind.JsxTextAllWhiteSpaces | SyntaxKind.RegularExpressionLiteral | SyntaxKind.NoSubstitutionTemplateLiteral;
export type PseudoLiteralSyntaxKind = SyntaxKind.TemplateHead | SyntaxKind.TemplateMiddle | SyntaxKind.TemplateTail;
export type PunctuationSyntaxKind = SyntaxKind.OpenBraceToken | SyntaxKind.CloseBraceToken | SyntaxKind.OpenParenToken | SyntaxKind.CloseParenToken | SyntaxKind.OpenBracketToken | SyntaxKind.CloseBracketToken | SyntaxKind.DotToken | SyntaxKind.DotDotDotToken | SyntaxKind.SemicolonToken | SyntaxKind.CommaToken | SyntaxKind.QuestionDotToken | SyntaxKind.LessThanToken | SyntaxKind.LessThanSlashToken | SyntaxKind.GreaterThanToken | SyntaxKind.LessThanEqualsToken | SyntaxKind.GreaterThanEqualsToken | SyntaxKind.EqualsEqualsToken | SyntaxKind.ExclamationEqualsToken | SyntaxKind.EqualsEqualsEqualsToken | SyntaxKind.ExclamationEqualsEqualsToken | SyntaxKind.EqualsGreaterThanToken | SyntaxKind.PlusToken | SyntaxKind.MinusToken | SyntaxKind.AsteriskToken | SyntaxKind.AsteriskAsteriskToken | SyntaxKind.SlashToken | SyntaxKind.PercentToken | SyntaxKind.PlusPlusToken | SyntaxKind.MinusMinusToken | SyntaxKind.LessThanLessThanToken | SyntaxKind.GreaterThanGreaterThanToken | SyntaxKind.GreaterThanGreaterThanGreaterThanToken | SyntaxKind.AmpersandToken | SyntaxKind.BarToken | SyntaxKind.CaretToken | SyntaxKind.ExclamationToken | SyntaxKind.TildeToken | SyntaxKind.AmpersandAmpersandToken | SyntaxKind.BarBarToken | SyntaxKind.QuestionQuestionToken | SyntaxKind.QuestionToken | SyntaxKind.ColonToken | SyntaxKind.AtToken | SyntaxKind.BacktickToken | SyntaxKind.EqualsToken | SyntaxKind.PlusEqualsToken | SyntaxKind.MinusEqualsToken | SyntaxKind.AsteriskEqualsToken | SyntaxKind.AsteriskAsteriskEqualsToken | SyntaxKind.SlashEqualsToken | SyntaxKind.PercentEqualsToken | SyntaxKind.LessThanLessThanEqualsToken | SyntaxKind.GreaterThanGreaterThanEqualsToken | SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken | SyntaxKind.AmpersandEqualsToken | SyntaxKind.BarEqualsToken | SyntaxKind.CaretEqualsToken;
export type KeywordSyntaxKind = SyntaxKind.AbstractKeyword | SyntaxKind.AnyKeyword | SyntaxKind.AsKeyword | SyntaxKind.AssertsKeyword | SyntaxKind.AsyncKeyword | SyntaxKind.AwaitKeyword | SyntaxKind.BigIntKeyword | SyntaxKind.BooleanKeyword | SyntaxKind.BreakKeyword | SyntaxKind.CapitalizeKeyword | SyntaxKind.CaseKeyword | SyntaxKind.CatchKeyword | SyntaxKind.ClassKeyword | SyntaxKind.ConstKeyword | SyntaxKind.ConstructorKeyword | SyntaxKind.ContinueKeyword | SyntaxKind.DebuggerKeyword | SyntaxKind.DeclareKeyword | SyntaxKind.DefaultKeyword | SyntaxKind.DeleteKeyword | SyntaxKind.DoKeyword | SyntaxKind.ElseKeyword | SyntaxKind.EnumKeyword | SyntaxKind.ExportKeyword | SyntaxKind.ExtendsKeyword | SyntaxKind.FalseKeyword | SyntaxKind.FinallyKeyword | SyntaxKind.ForKeyword | SyntaxKind.FromKeyword | SyntaxKind.FunctionKeyword | SyntaxKind.GetKeyword | SyntaxKind.GlobalKeyword | SyntaxKind.IfKeyword | SyntaxKind.ImplementsKeyword | SyntaxKind.ImportKeyword | SyntaxKind.InferKeyword | SyntaxKind.InKeyword | SyntaxKind.InstanceOfKeyword | SyntaxKind.InterfaceKeyword | SyntaxKind.IsKeyword | SyntaxKind.KeyOfKeyword | SyntaxKind.LetKeyword | SyntaxKind.LowercaseKeyword | SyntaxKind.ModuleKeyword | SyntaxKind.NamespaceKeyword | SyntaxKind.NeverKeyword | SyntaxKind.NewKeyword | SyntaxKind.NullKeyword | SyntaxKind.NumberKeyword | SyntaxKind.ObjectKeyword | SyntaxKind.OfKeyword | SyntaxKind.PackageKeyword | SyntaxKind.PrivateKeyword | SyntaxKind.ProtectedKeyword | SyntaxKind.PublicKeyword | SyntaxKind.ReadonlyKeyword | SyntaxKind.RequireKeyword | SyntaxKind.ReturnKeyword | SyntaxKind.SetKeyword | SyntaxKind.StaticKeyword | SyntaxKind.StringKeyword | SyntaxKind.SuperKeyword | SyntaxKind.SwitchKeyword | SyntaxKind.SymbolKeyword | SyntaxKind.ThisKeyword | SyntaxKind.ThrowKeyword | SyntaxKind.TrueKeyword | SyntaxKind.TryKeyword | SyntaxKind.TypeKeyword | SyntaxKind.TypeOfKeyword | SyntaxKind.UncapitalizeKeyword | SyntaxKind.UndefinedKeyword | SyntaxKind.UniqueKeyword | SyntaxKind.UnknownKeyword | SyntaxKind.UppercaseKeyword | SyntaxKind.VarKeyword | SyntaxKind.VoidKeyword | SyntaxKind.WhileKeyword | SyntaxKind.WithKeyword | SyntaxKind.YieldKeyword;
export type KeywordSyntaxKind = SyntaxKind.AbstractKeyword | SyntaxKind.AnyKeyword | SyntaxKind.AsKeyword | SyntaxKind.AssertsKeyword | SyntaxKind.AsyncKeyword | SyntaxKind.AwaitKeyword | SyntaxKind.BigIntKeyword | SyntaxKind.BooleanKeyword | SyntaxKind.BreakKeyword | SyntaxKind.CaseKeyword | SyntaxKind.CatchKeyword | SyntaxKind.ClassKeyword | SyntaxKind.ConstKeyword | SyntaxKind.ConstructorKeyword | SyntaxKind.ContinueKeyword | SyntaxKind.DebuggerKeyword | SyntaxKind.DeclareKeyword | SyntaxKind.DefaultKeyword | SyntaxKind.DeleteKeyword | SyntaxKind.DoKeyword | SyntaxKind.ElseKeyword | SyntaxKind.EnumKeyword | SyntaxKind.ExportKeyword | SyntaxKind.ExtendsKeyword | SyntaxKind.FalseKeyword | SyntaxKind.FinallyKeyword | SyntaxKind.ForKeyword | SyntaxKind.FromKeyword | SyntaxKind.FunctionKeyword | SyntaxKind.GetKeyword | SyntaxKind.GlobalKeyword | SyntaxKind.IfKeyword | SyntaxKind.ImplementsKeyword | SyntaxKind.ImportKeyword | SyntaxKind.InferKeyword | SyntaxKind.InKeyword | SyntaxKind.InstanceOfKeyword | SyntaxKind.InterfaceKeyword | SyntaxKind.IntrinsicKeyword | SyntaxKind.IsKeyword | SyntaxKind.KeyOfKeyword | SyntaxKind.LetKeyword | SyntaxKind.ModuleKeyword | SyntaxKind.NamespaceKeyword | SyntaxKind.NeverKeyword | SyntaxKind.NewKeyword | SyntaxKind.NullKeyword | SyntaxKind.NumberKeyword | SyntaxKind.ObjectKeyword | SyntaxKind.OfKeyword | SyntaxKind.PackageKeyword | SyntaxKind.PrivateKeyword | SyntaxKind.ProtectedKeyword | SyntaxKind.PublicKeyword | SyntaxKind.ReadonlyKeyword | SyntaxKind.RequireKeyword | SyntaxKind.ReturnKeyword | SyntaxKind.SetKeyword | SyntaxKind.StaticKeyword | SyntaxKind.StringKeyword | SyntaxKind.SuperKeyword | SyntaxKind.SwitchKeyword | SyntaxKind.SymbolKeyword | SyntaxKind.ThisKeyword | SyntaxKind.ThrowKeyword | SyntaxKind.TrueKeyword | SyntaxKind.TryKeyword | SyntaxKind.TypeKeyword | SyntaxKind.TypeOfKeyword | SyntaxKind.UndefinedKeyword | SyntaxKind.UniqueKeyword | SyntaxKind.UnknownKeyword | SyntaxKind.VarKeyword | SyntaxKind.VoidKeyword | SyntaxKind.WhileKeyword | SyntaxKind.WithKeyword | SyntaxKind.YieldKeyword;
export type ModifierSyntaxKind = SyntaxKind.AbstractKeyword | SyntaxKind.AsyncKeyword | SyntaxKind.ConstKeyword | SyntaxKind.DeclareKeyword | SyntaxKind.DefaultKeyword | SyntaxKind.ExportKeyword | SyntaxKind.PrivateKeyword | SyntaxKind.ProtectedKeyword | SyntaxKind.PublicKeyword | SyntaxKind.ReadonlyKeyword | SyntaxKind.StaticKeyword;
export type KeywordTypeSyntaxKind = SyntaxKind.AnyKeyword | SyntaxKind.BigIntKeyword | SyntaxKind.BooleanKeyword | SyntaxKind.NeverKeyword | SyntaxKind.NumberKeyword | SyntaxKind.ObjectKeyword | SyntaxKind.StringKeyword | SyntaxKind.SymbolKeyword | SyntaxKind.UndefinedKeyword | SyntaxKind.UnknownKeyword | SyntaxKind.VoidKeyword;
export type KeywordTypeSyntaxKind = SyntaxKind.AnyKeyword | SyntaxKind.BigIntKeyword | SyntaxKind.BooleanKeyword | SyntaxKind.IntrinsicKeyword | SyntaxKind.NeverKeyword | SyntaxKind.NumberKeyword | SyntaxKind.ObjectKeyword | SyntaxKind.StringKeyword | SyntaxKind.SymbolKeyword | SyntaxKind.UndefinedKeyword | SyntaxKind.UnknownKeyword | SyntaxKind.VoidKeyword;
export type TokenSyntaxKind = SyntaxKind.Unknown | SyntaxKind.EndOfFileToken | TriviaSyntaxKind | LiteralSyntaxKind | PseudoLiteralSyntaxKind | PunctuationSyntaxKind | SyntaxKind.Identifier | KeywordSyntaxKind;
export type JsxTokenSyntaxKind = SyntaxKind.LessThanSlashToken | SyntaxKind.EndOfFileToken | SyntaxKind.ConflictMarkerTrivia | SyntaxKind.JsxText | SyntaxKind.JsxTextAllWhiteSpaces | SyntaxKind.OpenBraceToken | SyntaxKind.LessThanToken;
export type JSDocSyntaxKind = SyntaxKind.EndOfFileToken | SyntaxKind.WhitespaceTrivia | SyntaxKind.AtToken | SyntaxKind.NewLineTrivia | SyntaxKind.AsteriskToken | SyntaxKind.OpenBraceToken | SyntaxKind.CloseBraceToken | SyntaxKind.LessThanToken | SyntaxKind.GreaterThanToken | SyntaxKind.OpenBracketToken | SyntaxKind.CloseBracketToken | SyntaxKind.EqualsToken | SyntaxKind.CommaToken | SyntaxKind.DotToken | SyntaxKind.Identifier | SyntaxKind.BacktickToken | SyntaxKind.Unknown | KeywordSyntaxKind;
@@ -972,17 +969,9 @@ declare namespace ts {
export interface TemplateLiteralTypeSpan extends TypeNode {
readonly kind: SyntaxKind.TemplateLiteralTypeSpan;
readonly parent: TemplateLiteralTypeNode;
readonly casing: TemplateCasing;
readonly type: TypeNode;
readonly literal: TemplateMiddle | TemplateTail;
}
export enum TemplateCasing {
None = 0,
Uppercase = 1,
Lowercase = 2,
Capitalize = 3,
Uncapitalize = 4
}
export interface Expression extends Node {
_expressionBrand: any;
}
@@ -2489,11 +2478,12 @@ declare namespace ts {
Substitution = 33554432,
NonPrimitive = 67108864,
TemplateLiteral = 134217728,
StringMapping = 268435456,
Literal = 2944,
Unit = 109440,
StringOrNumberLiteral = 384,
PossiblyFalsy = 117724,
StringLike = 134217860,
StringLike = 402653316,
NumberLike = 296,
BigIntLike = 2112,
BooleanLike = 528,
@@ -2504,10 +2494,10 @@ declare namespace ts {
StructuredType = 3670016,
TypeVariable = 8650752,
InstantiableNonPrimitive = 58982400,
InstantiablePrimitive = 138412032,
Instantiable = 197394432,
StructuredOrInstantiable = 201064448,
Narrowable = 268188671,
InstantiablePrimitive = 406847488,
Instantiable = 465829888,
StructuredOrInstantiable = 469499904,
Narrowable = 536624127,
}
export type DestructuringPattern = BindingPattern | ObjectLiteralExpression | ArrayLiteralExpression;
export interface Type {
@@ -2660,9 +2650,12 @@ declare namespace ts {
}
export interface TemplateLiteralType extends InstantiableType {
texts: readonly string[];
casings: readonly TemplateCasing[];
types: readonly Type[];
}
export interface StringMappingType extends InstantiableType {
symbol: Symbol;
type: Type;
}
export interface SubstitutionType extends InstantiableType {
baseType: Type;
substitute: Type;
@@ -3225,8 +3218,8 @@ declare namespace ts {
updateConstructSignature(node: ConstructSignatureDeclaration, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined): ConstructSignatureDeclaration;
createIndexSignature(decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode): IndexSignatureDeclaration;
updateIndexSignature(node: IndexSignatureDeclaration, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode): IndexSignatureDeclaration;
createTemplateLiteralTypeSpan(casing: TemplateCasing, type: TypeNode, literal: TemplateMiddle | TemplateTail): TemplateLiteralTypeSpan;
updateTemplateLiteralTypeSpan(casing: TemplateCasing, node: TemplateLiteralTypeSpan, type: TypeNode, literal: TemplateMiddle | TemplateTail): TemplateLiteralTypeSpan;
createTemplateLiteralTypeSpan(type: TypeNode, literal: TemplateMiddle | TemplateTail): TemplateLiteralTypeSpan;
updateTemplateLiteralTypeSpan(node: TemplateLiteralTypeSpan, type: TypeNode, literal: TemplateMiddle | TemplateTail): TemplateLiteralTypeSpan;
createKeywordTypeNode<TKind extends KeywordTypeSyntaxKind>(kind: TKind): KeywordTypeNode<TKind>;
createTypePredicateNode(assertsModifier: AssertsKeyword | undefined, parameterName: Identifier | ThisTypeNode | string, type: TypeNode | undefined): TypePredicateNode;
updateTypePredicateNode(node: TypePredicateNode, assertsModifier: AssertsKeyword | undefined, parameterName: Identifier | ThisTypeNode, type: TypeNode | undefined): TypePredicateNode;
@@ -0,0 +1,51 @@
tests/cases/conformance/types/typeAliases/intrinsicKeyword.ts(1,9): error TS2304: Cannot find name 'intrinsic'.
tests/cases/conformance/types/typeAliases/intrinsicKeyword.ts(2,22): error TS2304: Cannot find name 'intrinsic'.
tests/cases/conformance/types/typeAliases/intrinsicKeyword.ts(3,13): error TS2304: Cannot find name 'intrinsic'.
tests/cases/conformance/types/typeAliases/intrinsicKeyword.ts(4,23): error TS2795: The 'intrinsic' keyword can only be used to declare compiler provided intrinsic types.
tests/cases/conformance/types/typeAliases/intrinsicKeyword.ts(5,20): error TS2304: Cannot find name 'intrinsic'.
tests/cases/conformance/types/typeAliases/intrinsicKeyword.ts(6,28): error TS2313: Type parameter 'intrinsic' has a circular constraint.
tests/cases/conformance/types/typeAliases/intrinsicKeyword.ts(6,41): error TS2795: The 'intrinsic' keyword can only be used to declare compiler provided intrinsic types.
tests/cases/conformance/types/typeAliases/intrinsicKeyword.ts(7,28): error TS2313: Type parameter 'intrinsic' has a circular constraint.
tests/cases/conformance/types/typeAliases/intrinsicKeyword.ts(10,20): error TS2503: Cannot find namespace 'intrinsic'.
==== tests/cases/conformance/types/typeAliases/intrinsicKeyword.ts (9 errors) ====
let e1: intrinsic;
~~~~~~~~~
!!! error TS2304: Cannot find name 'intrinsic'.
let e2: { intrinsic: intrinsic };
~~~~~~~~~
!!! error TS2304: Cannot find name 'intrinsic'.
type TE1 = (intrinsic);
~~~~~~~~~
!!! error TS2304: Cannot find name 'intrinsic'.
type TE2<intrinsic> = intrinsic;
~~~~~~~~~
!!! error TS2795: The 'intrinsic' keyword can only be used to declare compiler provided intrinsic types.
type TE3<T extends intrinsic> = T;
~~~~~~~~~
!!! error TS2304: Cannot find name 'intrinsic'.
type TE4<intrinsic extends intrinsic> = intrinsic;
~~~~~~~~~
!!! error TS2313: Type parameter 'intrinsic' has a circular constraint.
~~~~~~~~~
!!! error TS2795: The 'intrinsic' keyword can only be used to declare compiler provided intrinsic types.
type TE5<intrinsic extends intrinsic> = (intrinsic);
~~~~~~~~~
!!! error TS2313: Type parameter 'intrinsic' has a circular constraint.
function f1() {
let intrinsic: intrinsic.intrinsic;
~~~~~~~~~
!!! error TS2503: Cannot find namespace 'intrinsic'.
}
function f2(intrinsic: string) {
return intrinsic;
}
function f3() {
type intrinsic = string;
let s1: intrinsic = 'ok';
}
@@ -0,0 +1,36 @@
//// [intrinsicKeyword.ts]
let e1: intrinsic;
let e2: { intrinsic: intrinsic };
type TE1 = (intrinsic);
type TE2<intrinsic> = intrinsic;
type TE3<T extends intrinsic> = T;
type TE4<intrinsic extends intrinsic> = intrinsic;
type TE5<intrinsic extends intrinsic> = (intrinsic);
function f1() {
let intrinsic: intrinsic.intrinsic;
}
function f2(intrinsic: string) {
return intrinsic;
}
function f3() {
type intrinsic = string;
let s1: intrinsic = 'ok';
}
//// [intrinsicKeyword.js]
"use strict";
var e1;
var e2;
function f1() {
var intrinsic;
}
function f2(intrinsic) {
return intrinsic;
}
function f3() {
var s1 = 'ok';
}
@@ -0,0 +1,57 @@
=== tests/cases/conformance/types/typeAliases/intrinsicKeyword.ts ===
let e1: intrinsic;
>e1 : Symbol(e1, Decl(intrinsicKeyword.ts, 0, 3))
let e2: { intrinsic: intrinsic };
>e2 : Symbol(e2, Decl(intrinsicKeyword.ts, 1, 3))
>intrinsic : Symbol(intrinsic, Decl(intrinsicKeyword.ts, 1, 9))
type TE1 = (intrinsic);
>TE1 : Symbol(TE1, Decl(intrinsicKeyword.ts, 1, 33))
type TE2<intrinsic> = intrinsic;
>TE2 : Symbol(TE2, Decl(intrinsicKeyword.ts, 2, 23))
>intrinsic : Symbol(intrinsic, Decl(intrinsicKeyword.ts, 3, 9))
type TE3<T extends intrinsic> = T;
>TE3 : Symbol(TE3, Decl(intrinsicKeyword.ts, 3, 32))
>T : Symbol(T, Decl(intrinsicKeyword.ts, 4, 9))
>T : Symbol(T, Decl(intrinsicKeyword.ts, 4, 9))
type TE4<intrinsic extends intrinsic> = intrinsic;
>TE4 : Symbol(TE4, Decl(intrinsicKeyword.ts, 4, 34))
>intrinsic : Symbol(intrinsic, Decl(intrinsicKeyword.ts, 5, 9))
>intrinsic : Symbol(intrinsic, Decl(intrinsicKeyword.ts, 5, 9))
type TE5<intrinsic extends intrinsic> = (intrinsic);
>TE5 : Symbol(TE5, Decl(intrinsicKeyword.ts, 5, 50))
>intrinsic : Symbol(intrinsic, Decl(intrinsicKeyword.ts, 6, 9))
>intrinsic : Symbol(intrinsic, Decl(intrinsicKeyword.ts, 6, 9))
>intrinsic : Symbol(intrinsic, Decl(intrinsicKeyword.ts, 6, 9))
function f1() {
>f1 : Symbol(f1, Decl(intrinsicKeyword.ts, 6, 52))
let intrinsic: intrinsic.intrinsic;
>intrinsic : Symbol(intrinsic, Decl(intrinsicKeyword.ts, 9, 7))
}
function f2(intrinsic: string) {
>f2 : Symbol(f2, Decl(intrinsicKeyword.ts, 10, 1))
>intrinsic : Symbol(intrinsic, Decl(intrinsicKeyword.ts, 12, 12))
return intrinsic;
>intrinsic : Symbol(intrinsic, Decl(intrinsicKeyword.ts, 12, 12))
}
function f3() {
>f3 : Symbol(f3, Decl(intrinsicKeyword.ts, 14, 1))
type intrinsic = string;
>intrinsic : Symbol(intrinsic, Decl(intrinsicKeyword.ts, 16, 15))
let s1: intrinsic = 'ok';
>s1 : Symbol(s1, Decl(intrinsicKeyword.ts, 18, 7))
>intrinsic : Symbol(intrinsic, Decl(intrinsicKeyword.ts, 16, 15))
}
@@ -0,0 +1,50 @@
=== tests/cases/conformance/types/typeAliases/intrinsicKeyword.ts ===
let e1: intrinsic;
>e1 : any
let e2: { intrinsic: intrinsic };
>e2 : { intrinsic: any; }
>intrinsic : any
type TE1 = (intrinsic);
>TE1 : any
type TE2<intrinsic> = intrinsic;
>TE2 : intrinsic
type TE3<T extends intrinsic> = T;
>TE3 : T
type TE4<intrinsic extends intrinsic> = intrinsic;
>TE4 : intrinsic
type TE5<intrinsic extends intrinsic> = (intrinsic);
>TE5 : intrinsic
function f1() {
>f1 : () => void
let intrinsic: intrinsic.intrinsic;
>intrinsic : any
>intrinsic : any
}
function f2(intrinsic: string) {
>f2 : (intrinsic: string) => string
>intrinsic : string
return intrinsic;
>intrinsic : string
}
function f3() {
>f3 : () => void
type intrinsic = string;
>intrinsic : string
let s1: intrinsic = 'ok';
>s1 : string
>'ok' : "ok"
}
@@ -0,0 +1,90 @@
tests/cases/conformance/types/typeAliases/intrinsicTypes.ts(6,22): error TS2344: Type 'number' does not satisfy the constraint 'string'.
tests/cases/conformance/types/typeAliases/intrinsicTypes.ts(13,22): error TS2344: Type 'number' does not satisfy the constraint 'string'.
tests/cases/conformance/types/typeAliases/intrinsicTypes.ts(20,23): error TS2344: Type 'number' does not satisfy the constraint 'string'.
tests/cases/conformance/types/typeAliases/intrinsicTypes.ts(27,25): error TS2344: Type 'number' does not satisfy the constraint 'string'.
tests/cases/conformance/types/typeAliases/intrinsicTypes.ts(35,38): error TS2795: The 'intrinsic' keyword can only be used to declare compiler provided intrinsic types.
tests/cases/conformance/types/typeAliases/intrinsicTypes.ts(40,5): error TS2322: Type 'string' is not assignable to type 'Uppercase<T>'.
tests/cases/conformance/types/typeAliases/intrinsicTypes.ts(42,5): error TS2322: Type 'string' is not assignable to type 'Uppercase<U>'.
tests/cases/conformance/types/typeAliases/intrinsicTypes.ts(43,5): error TS2322: Type 'Uppercase<T>' is not assignable to type 'Uppercase<U>'.
Type 'T' is not assignable to type 'U'.
'T' is assignable to the constraint of type 'U', but 'U' could be instantiated with a different subtype of constraint 'string'.
Type 'string' is not assignable to type 'U'.
'string' is assignable to the constraint of type 'U', but 'U' could be instantiated with a different subtype of constraint 'string'.
==== tests/cases/conformance/types/typeAliases/intrinsicTypes.ts (8 errors) ====
type TU1 = Uppercase<'hello'>; // "HELLO"
type TU2 = Uppercase<'foo' | 'bar'>; // "FOO" | "BAR"
type TU3 = Uppercase<string>; // string
type TU4 = Uppercase<any>; // any
type TU5 = Uppercase<never>; // never
type TU6 = Uppercase<42>; // Error
~~
!!! error TS2344: Type 'number' does not satisfy the constraint 'string'.
type TL1 = Lowercase<'HELLO'>; // "hello"
type TL2 = Lowercase<'FOO' | 'BAR'>; // "foo" | "bar"
type TL3 = Lowercase<string>; // string
type TL4 = Lowercase<any>; // any
type TL5 = Lowercase<never>; // never
type TL6 = Lowercase<42>; // Error
~~
!!! error TS2344: Type 'number' does not satisfy the constraint 'string'.
type TC1 = Capitalize<'hello'>; // "Hello"
type TC2 = Capitalize<'foo' | 'bar'>; // "Foo" | "Bar"
type TC3 = Capitalize<string>; // string
type TC4 = Capitalize<any>; // any
type TC5 = Capitalize<never>; // never
type TC6 = Capitalize<42>; // Error
~~
!!! error TS2344: Type 'number' does not satisfy the constraint 'string'.
type TN1 = Uncapitalize<'Hello'>; // "hello"
type TN2 = Uncapitalize<'Foo' | 'Bar'>; // "foo" | "bar"
type TN3 = Uncapitalize<string>; // string
type TN4 = Uncapitalize<any>; // any
type TN5 = Uncapitalize<never>; // never
type TN6 = Uncapitalize<42>; // Error
~~
!!! error TS2344: Type 'number' does not satisfy the constraint 'string'.
type TX1<S extends string> = Uppercase<`aB${S}`>;
type TX2 = TX1<'xYz'>; // "ABXYZ"
type TX3<S extends string> = Lowercase<`aB${S}`>;
type TX4 = TX3<'xYz'>; // "abxyz"
type TX5 = `${Uppercase<'abc'>}${Lowercase<'XYZ'>}`; // "ABCxyz"
type MyUppercase<S extends string> = intrinsic; // Error
~~~~~~~~~
!!! error TS2795: The 'intrinsic' keyword can only be used to declare compiler provided intrinsic types.
function foo1<T extends string, U extends T>(s: string, x: Uppercase<T>, y: Uppercase<U>) {
s = x;
s = y;
x = s; // Error
~
!!! error TS2322: Type 'string' is not assignable to type 'Uppercase<T>'.
x = y;
y = s; // Error
~
!!! error TS2322: Type 'string' is not assignable to type 'Uppercase<U>'.
y = x; // Error
~
!!! error TS2322: Type 'Uppercase<T>' is not assignable to type 'Uppercase<U>'.
!!! error TS2322: Type 'T' is not assignable to type 'U'.
!!! error TS2322: 'T' is assignable to the constraint of type 'U', but 'U' could be instantiated with a different subtype of constraint 'string'.
!!! error TS2322: Type 'string' is not assignable to type 'U'.
!!! error TS2322: 'string' is assignable to the constraint of type 'U', but 'U' could be instantiated with a different subtype of constraint 'string'.
}
function foo2<T extends 'foo' | 'bar'>(x: Uppercase<T>) {
let s: 'FOO' | 'BAR' = x;
}
declare function foo3<T extends string>(x: Uppercase<T>): T;
function foo4<U extends string>(x: Uppercase<U>) {
return foo3(x);
}
+110
View File
@@ -0,0 +1,110 @@
//// [intrinsicTypes.ts]
type TU1 = Uppercase<'hello'>; // "HELLO"
type TU2 = Uppercase<'foo' | 'bar'>; // "FOO" | "BAR"
type TU3 = Uppercase<string>; // string
type TU4 = Uppercase<any>; // any
type TU5 = Uppercase<never>; // never
type TU6 = Uppercase<42>; // Error
type TL1 = Lowercase<'HELLO'>; // "hello"
type TL2 = Lowercase<'FOO' | 'BAR'>; // "foo" | "bar"
type TL3 = Lowercase<string>; // string
type TL4 = Lowercase<any>; // any
type TL5 = Lowercase<never>; // never
type TL6 = Lowercase<42>; // Error
type TC1 = Capitalize<'hello'>; // "Hello"
type TC2 = Capitalize<'foo' | 'bar'>; // "Foo" | "Bar"
type TC3 = Capitalize<string>; // string
type TC4 = Capitalize<any>; // any
type TC5 = Capitalize<never>; // never
type TC6 = Capitalize<42>; // Error
type TN1 = Uncapitalize<'Hello'>; // "hello"
type TN2 = Uncapitalize<'Foo' | 'Bar'>; // "foo" | "bar"
type TN3 = Uncapitalize<string>; // string
type TN4 = Uncapitalize<any>; // any
type TN5 = Uncapitalize<never>; // never
type TN6 = Uncapitalize<42>; // Error
type TX1<S extends string> = Uppercase<`aB${S}`>;
type TX2 = TX1<'xYz'>; // "ABXYZ"
type TX3<S extends string> = Lowercase<`aB${S}`>;
type TX4 = TX3<'xYz'>; // "abxyz"
type TX5 = `${Uppercase<'abc'>}${Lowercase<'XYZ'>}`; // "ABCxyz"
type MyUppercase<S extends string> = intrinsic; // Error
function foo1<T extends string, U extends T>(s: string, x: Uppercase<T>, y: Uppercase<U>) {
s = x;
s = y;
x = s; // Error
x = y;
y = s; // Error
y = x; // Error
}
function foo2<T extends 'foo' | 'bar'>(x: Uppercase<T>) {
let s: 'FOO' | 'BAR' = x;
}
declare function foo3<T extends string>(x: Uppercase<T>): T;
function foo4<U extends string>(x: Uppercase<U>) {
return foo3(x);
}
//// [intrinsicTypes.js]
"use strict";
function foo1(s, x, y) {
s = x;
s = y;
x = s; // Error
x = y;
y = s; // Error
y = x; // Error
}
function foo2(x) {
var s = x;
}
function foo4(x) {
return foo3(x);
}
//// [intrinsicTypes.d.ts]
declare type TU1 = Uppercase<'hello'>;
declare type TU2 = Uppercase<'foo' | 'bar'>;
declare type TU3 = Uppercase<string>;
declare type TU4 = Uppercase<any>;
declare type TU5 = Uppercase<never>;
declare type TU6 = Uppercase<42>;
declare type TL1 = Lowercase<'HELLO'>;
declare type TL2 = Lowercase<'FOO' | 'BAR'>;
declare type TL3 = Lowercase<string>;
declare type TL4 = Lowercase<any>;
declare type TL5 = Lowercase<never>;
declare type TL6 = Lowercase<42>;
declare type TC1 = Capitalize<'hello'>;
declare type TC2 = Capitalize<'foo' | 'bar'>;
declare type TC3 = Capitalize<string>;
declare type TC4 = Capitalize<any>;
declare type TC5 = Capitalize<never>;
declare type TC6 = Capitalize<42>;
declare type TN1 = Uncapitalize<'Hello'>;
declare type TN2 = Uncapitalize<'Foo' | 'Bar'>;
declare type TN3 = Uncapitalize<string>;
declare type TN4 = Uncapitalize<any>;
declare type TN5 = Uncapitalize<never>;
declare type TN6 = Uncapitalize<42>;
declare type TX1<S extends string> = Uppercase<`aB${S}`>;
declare type TX2 = TX1<'xYz'>;
declare type TX3<S extends string> = Lowercase<`aB${S}`>;
declare type TX4 = TX3<'xYz'>;
declare type TX5 = `${Uppercase<'abc'>}${Lowercase<'XYZ'>}`;
declare type MyUppercase<S extends string> = intrinsic;
declare function foo1<T extends string, U extends T>(s: string, x: Uppercase<T>, y: Uppercase<U>): void;
declare function foo2<T extends 'foo' | 'bar'>(x: Uppercase<T>): void;
declare function foo3<T extends string>(x: Uppercase<T>): T;
declare function foo4<U extends string>(x: Uppercase<U>): U;
@@ -0,0 +1,196 @@
=== tests/cases/conformance/types/typeAliases/intrinsicTypes.ts ===
type TU1 = Uppercase<'hello'>; // "HELLO"
>TU1 : Symbol(TU1, Decl(intrinsicTypes.ts, 0, 0))
>Uppercase : Symbol(Uppercase, Decl(lib.es5.d.ts, --, --))
type TU2 = Uppercase<'foo' | 'bar'>; // "FOO" | "BAR"
>TU2 : Symbol(TU2, Decl(intrinsicTypes.ts, 0, 30))
>Uppercase : Symbol(Uppercase, Decl(lib.es5.d.ts, --, --))
type TU3 = Uppercase<string>; // string
>TU3 : Symbol(TU3, Decl(intrinsicTypes.ts, 1, 36))
>Uppercase : Symbol(Uppercase, Decl(lib.es5.d.ts, --, --))
type TU4 = Uppercase<any>; // any
>TU4 : Symbol(TU4, Decl(intrinsicTypes.ts, 2, 29))
>Uppercase : Symbol(Uppercase, Decl(lib.es5.d.ts, --, --))
type TU5 = Uppercase<never>; // never
>TU5 : Symbol(TU5, Decl(intrinsicTypes.ts, 3, 26))
>Uppercase : Symbol(Uppercase, Decl(lib.es5.d.ts, --, --))
type TU6 = Uppercase<42>; // Error
>TU6 : Symbol(TU6, Decl(intrinsicTypes.ts, 4, 28))
>Uppercase : Symbol(Uppercase, Decl(lib.es5.d.ts, --, --))
type TL1 = Lowercase<'HELLO'>; // "hello"
>TL1 : Symbol(TL1, Decl(intrinsicTypes.ts, 5, 25))
>Lowercase : Symbol(Lowercase, Decl(lib.es5.d.ts, --, --))
type TL2 = Lowercase<'FOO' | 'BAR'>; // "foo" | "bar"
>TL2 : Symbol(TL2, Decl(intrinsicTypes.ts, 7, 30))
>Lowercase : Symbol(Lowercase, Decl(lib.es5.d.ts, --, --))
type TL3 = Lowercase<string>; // string
>TL3 : Symbol(TL3, Decl(intrinsicTypes.ts, 8, 36))
>Lowercase : Symbol(Lowercase, Decl(lib.es5.d.ts, --, --))
type TL4 = Lowercase<any>; // any
>TL4 : Symbol(TL4, Decl(intrinsicTypes.ts, 9, 29))
>Lowercase : Symbol(Lowercase, Decl(lib.es5.d.ts, --, --))
type TL5 = Lowercase<never>; // never
>TL5 : Symbol(TL5, Decl(intrinsicTypes.ts, 10, 26))
>Lowercase : Symbol(Lowercase, Decl(lib.es5.d.ts, --, --))
type TL6 = Lowercase<42>; // Error
>TL6 : Symbol(TL6, Decl(intrinsicTypes.ts, 11, 28))
>Lowercase : Symbol(Lowercase, Decl(lib.es5.d.ts, --, --))
type TC1 = Capitalize<'hello'>; // "Hello"
>TC1 : Symbol(TC1, Decl(intrinsicTypes.ts, 12, 25))
>Capitalize : Symbol(Capitalize, Decl(lib.es5.d.ts, --, --))
type TC2 = Capitalize<'foo' | 'bar'>; // "Foo" | "Bar"
>TC2 : Symbol(TC2, Decl(intrinsicTypes.ts, 14, 31))
>Capitalize : Symbol(Capitalize, Decl(lib.es5.d.ts, --, --))
type TC3 = Capitalize<string>; // string
>TC3 : Symbol(TC3, Decl(intrinsicTypes.ts, 15, 37))
>Capitalize : Symbol(Capitalize, Decl(lib.es5.d.ts, --, --))
type TC4 = Capitalize<any>; // any
>TC4 : Symbol(TC4, Decl(intrinsicTypes.ts, 16, 30))
>Capitalize : Symbol(Capitalize, Decl(lib.es5.d.ts, --, --))
type TC5 = Capitalize<never>; // never
>TC5 : Symbol(TC5, Decl(intrinsicTypes.ts, 17, 27))
>Capitalize : Symbol(Capitalize, Decl(lib.es5.d.ts, --, --))
type TC6 = Capitalize<42>; // Error
>TC6 : Symbol(TC6, Decl(intrinsicTypes.ts, 18, 29))
>Capitalize : Symbol(Capitalize, Decl(lib.es5.d.ts, --, --))
type TN1 = Uncapitalize<'Hello'>; // "hello"
>TN1 : Symbol(TN1, Decl(intrinsicTypes.ts, 19, 26))
>Uncapitalize : Symbol(Uncapitalize, Decl(lib.es5.d.ts, --, --))
type TN2 = Uncapitalize<'Foo' | 'Bar'>; // "foo" | "bar"
>TN2 : Symbol(TN2, Decl(intrinsicTypes.ts, 21, 33))
>Uncapitalize : Symbol(Uncapitalize, Decl(lib.es5.d.ts, --, --))
type TN3 = Uncapitalize<string>; // string
>TN3 : Symbol(TN3, Decl(intrinsicTypes.ts, 22, 39))
>Uncapitalize : Symbol(Uncapitalize, Decl(lib.es5.d.ts, --, --))
type TN4 = Uncapitalize<any>; // any
>TN4 : Symbol(TN4, Decl(intrinsicTypes.ts, 23, 32))
>Uncapitalize : Symbol(Uncapitalize, Decl(lib.es5.d.ts, --, --))
type TN5 = Uncapitalize<never>; // never
>TN5 : Symbol(TN5, Decl(intrinsicTypes.ts, 24, 29))
>Uncapitalize : Symbol(Uncapitalize, Decl(lib.es5.d.ts, --, --))
type TN6 = Uncapitalize<42>; // Error
>TN6 : Symbol(TN6, Decl(intrinsicTypes.ts, 25, 31))
>Uncapitalize : Symbol(Uncapitalize, Decl(lib.es5.d.ts, --, --))
type TX1<S extends string> = Uppercase<`aB${S}`>;
>TX1 : Symbol(TX1, Decl(intrinsicTypes.ts, 26, 28))
>S : Symbol(S, Decl(intrinsicTypes.ts, 28, 9))
>Uppercase : Symbol(Uppercase, Decl(lib.es5.d.ts, --, --))
>S : Symbol(S, Decl(intrinsicTypes.ts, 28, 9))
type TX2 = TX1<'xYz'>; // "ABXYZ"
>TX2 : Symbol(TX2, Decl(intrinsicTypes.ts, 28, 49))
>TX1 : Symbol(TX1, Decl(intrinsicTypes.ts, 26, 28))
type TX3<S extends string> = Lowercase<`aB${S}`>;
>TX3 : Symbol(TX3, Decl(intrinsicTypes.ts, 29, 22))
>S : Symbol(S, Decl(intrinsicTypes.ts, 30, 9))
>Lowercase : Symbol(Lowercase, Decl(lib.es5.d.ts, --, --))
>S : Symbol(S, Decl(intrinsicTypes.ts, 30, 9))
type TX4 = TX3<'xYz'>; // "abxyz"
>TX4 : Symbol(TX4, Decl(intrinsicTypes.ts, 30, 49))
>TX3 : Symbol(TX3, Decl(intrinsicTypes.ts, 29, 22))
type TX5 = `${Uppercase<'abc'>}${Lowercase<'XYZ'>}`; // "ABCxyz"
>TX5 : Symbol(TX5, Decl(intrinsicTypes.ts, 31, 22))
>Uppercase : Symbol(Uppercase, Decl(lib.es5.d.ts, --, --))
>Lowercase : Symbol(Lowercase, Decl(lib.es5.d.ts, --, --))
type MyUppercase<S extends string> = intrinsic; // Error
>MyUppercase : Symbol(MyUppercase, Decl(intrinsicTypes.ts, 32, 52))
>S : Symbol(S, Decl(intrinsicTypes.ts, 34, 17))
function foo1<T extends string, U extends T>(s: string, x: Uppercase<T>, y: Uppercase<U>) {
>foo1 : Symbol(foo1, Decl(intrinsicTypes.ts, 34, 47))
>T : Symbol(T, Decl(intrinsicTypes.ts, 36, 14))
>U : Symbol(U, Decl(intrinsicTypes.ts, 36, 31))
>T : Symbol(T, Decl(intrinsicTypes.ts, 36, 14))
>s : Symbol(s, Decl(intrinsicTypes.ts, 36, 45))
>x : Symbol(x, Decl(intrinsicTypes.ts, 36, 55))
>Uppercase : Symbol(Uppercase, Decl(lib.es5.d.ts, --, --))
>T : Symbol(T, Decl(intrinsicTypes.ts, 36, 14))
>y : Symbol(y, Decl(intrinsicTypes.ts, 36, 72))
>Uppercase : Symbol(Uppercase, Decl(lib.es5.d.ts, --, --))
>U : Symbol(U, Decl(intrinsicTypes.ts, 36, 31))
s = x;
>s : Symbol(s, Decl(intrinsicTypes.ts, 36, 45))
>x : Symbol(x, Decl(intrinsicTypes.ts, 36, 55))
s = y;
>s : Symbol(s, Decl(intrinsicTypes.ts, 36, 45))
>y : Symbol(y, Decl(intrinsicTypes.ts, 36, 72))
x = s; // Error
>x : Symbol(x, Decl(intrinsicTypes.ts, 36, 55))
>s : Symbol(s, Decl(intrinsicTypes.ts, 36, 45))
x = y;
>x : Symbol(x, Decl(intrinsicTypes.ts, 36, 55))
>y : Symbol(y, Decl(intrinsicTypes.ts, 36, 72))
y = s; // Error
>y : Symbol(y, Decl(intrinsicTypes.ts, 36, 72))
>s : Symbol(s, Decl(intrinsicTypes.ts, 36, 45))
y = x; // Error
>y : Symbol(y, Decl(intrinsicTypes.ts, 36, 72))
>x : Symbol(x, Decl(intrinsicTypes.ts, 36, 55))
}
function foo2<T extends 'foo' | 'bar'>(x: Uppercase<T>) {
>foo2 : Symbol(foo2, Decl(intrinsicTypes.ts, 43, 1))
>T : Symbol(T, Decl(intrinsicTypes.ts, 45, 14))
>x : Symbol(x, Decl(intrinsicTypes.ts, 45, 39))
>Uppercase : Symbol(Uppercase, Decl(lib.es5.d.ts, --, --))
>T : Symbol(T, Decl(intrinsicTypes.ts, 45, 14))
let s: 'FOO' | 'BAR' = x;
>s : Symbol(s, Decl(intrinsicTypes.ts, 46, 7))
>x : Symbol(x, Decl(intrinsicTypes.ts, 45, 39))
}
declare function foo3<T extends string>(x: Uppercase<T>): T;
>foo3 : Symbol(foo3, Decl(intrinsicTypes.ts, 47, 1))
>T : Symbol(T, Decl(intrinsicTypes.ts, 49, 22))
>x : Symbol(x, Decl(intrinsicTypes.ts, 49, 40))
>Uppercase : Symbol(Uppercase, Decl(lib.es5.d.ts, --, --))
>T : Symbol(T, Decl(intrinsicTypes.ts, 49, 22))
>T : Symbol(T, Decl(intrinsicTypes.ts, 49, 22))
function foo4<U extends string>(x: Uppercase<U>) {
>foo4 : Symbol(foo4, Decl(intrinsicTypes.ts, 49, 60))
>U : Symbol(U, Decl(intrinsicTypes.ts, 51, 14))
>x : Symbol(x, Decl(intrinsicTypes.ts, 51, 32))
>Uppercase : Symbol(Uppercase, Decl(lib.es5.d.ts, --, --))
>U : Symbol(U, Decl(intrinsicTypes.ts, 51, 14))
return foo3(x);
>foo3 : Symbol(foo3, Decl(intrinsicTypes.ts, 47, 1))
>x : Symbol(x, Decl(intrinsicTypes.ts, 51, 32))
}
@@ -0,0 +1,151 @@
=== tests/cases/conformance/types/typeAliases/intrinsicTypes.ts ===
type TU1 = Uppercase<'hello'>; // "HELLO"
>TU1 : "HELLO"
type TU2 = Uppercase<'foo' | 'bar'>; // "FOO" | "BAR"
>TU2 : "FOO" | "BAR"
type TU3 = Uppercase<string>; // string
>TU3 : string
type TU4 = Uppercase<any>; // any
>TU4 : any
type TU5 = Uppercase<never>; // never
>TU5 : never
type TU6 = Uppercase<42>; // Error
>TU6 : 42
type TL1 = Lowercase<'HELLO'>; // "hello"
>TL1 : "hello"
type TL2 = Lowercase<'FOO' | 'BAR'>; // "foo" | "bar"
>TL2 : "foo" | "bar"
type TL3 = Lowercase<string>; // string
>TL3 : string
type TL4 = Lowercase<any>; // any
>TL4 : any
type TL5 = Lowercase<never>; // never
>TL5 : never
type TL6 = Lowercase<42>; // Error
>TL6 : 42
type TC1 = Capitalize<'hello'>; // "Hello"
>TC1 : "Hello"
type TC2 = Capitalize<'foo' | 'bar'>; // "Foo" | "Bar"
>TC2 : "Foo" | "Bar"
type TC3 = Capitalize<string>; // string
>TC3 : string
type TC4 = Capitalize<any>; // any
>TC4 : any
type TC5 = Capitalize<never>; // never
>TC5 : never
type TC6 = Capitalize<42>; // Error
>TC6 : 42
type TN1 = Uncapitalize<'Hello'>; // "hello"
>TN1 : "hello"
type TN2 = Uncapitalize<'Foo' | 'Bar'>; // "foo" | "bar"
>TN2 : "foo" | "bar"
type TN3 = Uncapitalize<string>; // string
>TN3 : string
type TN4 = Uncapitalize<any>; // any
>TN4 : any
type TN5 = Uncapitalize<never>; // never
>TN5 : never
type TN6 = Uncapitalize<42>; // Error
>TN6 : 42
type TX1<S extends string> = Uppercase<`aB${S}`>;
>TX1 : Uppercase<`aB${S}`>
type TX2 = TX1<'xYz'>; // "ABXYZ"
>TX2 : "ABXYZ"
type TX3<S extends string> = Lowercase<`aB${S}`>;
>TX3 : Lowercase<`aB${S}`>
type TX4 = TX3<'xYz'>; // "abxyz"
>TX4 : "abxyz"
type TX5 = `${Uppercase<'abc'>}${Lowercase<'XYZ'>}`; // "ABCxyz"
>TX5 : "ABCxyz"
type MyUppercase<S extends string> = intrinsic; // Error
>MyUppercase : intrinsic
function foo1<T extends string, U extends T>(s: string, x: Uppercase<T>, y: Uppercase<U>) {
>foo1 : <T extends string, U extends T>(s: string, x: Uppercase<T>, y: Uppercase<U>) => void
>s : string
>x : Uppercase<T>
>y : Uppercase<U>
s = x;
>s = x : Uppercase<T>
>s : string
>x : Uppercase<T>
s = y;
>s = y : Uppercase<U>
>s : string
>y : Uppercase<U>
x = s; // Error
>x = s : string
>x : Uppercase<T>
>s : string
x = y;
>x = y : Uppercase<U>
>x : Uppercase<T>
>y : Uppercase<U>
y = s; // Error
>y = s : string
>y : Uppercase<U>
>s : string
y = x; // Error
>y = x : Uppercase<T>
>y : Uppercase<U>
>x : Uppercase<T>
}
function foo2<T extends 'foo' | 'bar'>(x: Uppercase<T>) {
>foo2 : <T extends "foo" | "bar">(x: Uppercase<T>) => void
>x : Uppercase<T>
let s: 'FOO' | 'BAR' = x;
>s : "FOO" | "BAR"
>x : Uppercase<T>
}
declare function foo3<T extends string>(x: Uppercase<T>): T;
>foo3 : <T extends string>(x: Uppercase<T>) => T
>x : Uppercase<T>
function foo4<U extends string>(x: Uppercase<U>) {
>foo4 : <U extends string>(x: Uppercase<U>) => U
>x : Uppercase<U>
return foo3(x);
>foo3(x) : U
>foo3 : <T extends string>(x: Uppercase<T>) => T
>x : Uppercase<U>
}
@@ -1,7 +1,7 @@
//// [mappedTypeAsClauses.ts]
// Mapped type 'as N' clauses
type Getters<T> = { [P in keyof T & string as `get${capitalize P}`]: () => T[P] };
type Getters<T> = { [P in keyof T & string as `get${Capitalize<P>}`]: () => T[P] };
type TG1 = Getters<{ foo: string, bar: number, baz: { z: boolean } }>;
// Mapped type with 'as N' clause has no constraint on 'in T' clause
@@ -32,7 +32,7 @@ type TD3<U> = keyof DoubleProp<U>; // `${keyof U & string}1` | `${keyof U & str
// Repro from #40619
type Lazyify<T> = {
[K in keyof T as `get${capitalize string & K}`]: () => T[K]
[K in keyof T as `get${Capitalize<K & string>}`]: () => T[K]
};
interface Person {
@@ -51,7 +51,7 @@ type LazyPerson = Lazyify<Person>;
//// [mappedTypeAsClauses.d.ts]
declare type Getters<T> = {
[P in keyof T & string as `get${capitalize P}`]: () => T[P];
[P in keyof T & string as `get${Capitalize<P>}`]: () => T[P];
};
declare type TG1 = Getters<{
foo: string;
@@ -97,7 +97,7 @@ declare type TD1 = DoubleProp<{
declare type TD2 = keyof TD1;
declare type TD3<U> = keyof DoubleProp<U>;
declare type Lazyify<T> = {
[K in keyof T as `get${capitalize string & K}`]: () => T[K];
[K in keyof T as `get${Capitalize<K & string>}`]: () => T[K];
};
interface Person {
readonly name: string;
@@ -1,17 +1,18 @@
=== tests/cases/conformance/types/mapped/mappedTypeAsClauses.ts ===
// Mapped type 'as N' clauses
type Getters<T> = { [P in keyof T & string as `get${capitalize P}`]: () => T[P] };
type Getters<T> = { [P in keyof T & string as `get${Capitalize<P>}`]: () => T[P] };
>Getters : Symbol(Getters, Decl(mappedTypeAsClauses.ts, 0, 0))
>T : Symbol(T, Decl(mappedTypeAsClauses.ts, 2, 13))
>P : Symbol(P, Decl(mappedTypeAsClauses.ts, 2, 21))
>T : Symbol(T, Decl(mappedTypeAsClauses.ts, 2, 13))
>Capitalize : Symbol(Capitalize, Decl(lib.es5.d.ts, --, --))
>P : Symbol(P, Decl(mappedTypeAsClauses.ts, 2, 21))
>T : Symbol(T, Decl(mappedTypeAsClauses.ts, 2, 13))
>P : Symbol(P, Decl(mappedTypeAsClauses.ts, 2, 21))
type TG1 = Getters<{ foo: string, bar: number, baz: { z: boolean } }>;
>TG1 : Symbol(TG1, Decl(mappedTypeAsClauses.ts, 2, 82))
>TG1 : Symbol(TG1, Decl(mappedTypeAsClauses.ts, 2, 83))
>Getters : Symbol(Getters, Decl(mappedTypeAsClauses.ts, 0, 0))
>foo : Symbol(foo, Decl(mappedTypeAsClauses.ts, 3, 20))
>bar : Symbol(bar, Decl(mappedTypeAsClauses.ts, 3, 33))
@@ -114,9 +115,10 @@ type Lazyify<T> = {
>Lazyify : Symbol(Lazyify, Decl(mappedTypeAsClauses.ts, 28, 34))
>T : Symbol(T, Decl(mappedTypeAsClauses.ts, 32, 13))
[K in keyof T as `get${capitalize string & K}`]: () => T[K]
[K in keyof T as `get${Capitalize<K & string>}`]: () => T[K]
>K : Symbol(K, Decl(mappedTypeAsClauses.ts, 33, 5))
>T : Symbol(T, Decl(mappedTypeAsClauses.ts, 32, 13))
>Capitalize : Symbol(Capitalize, Decl(lib.es5.d.ts, --, --))
>K : Symbol(K, Decl(mappedTypeAsClauses.ts, 33, 5))
>T : Symbol(T, Decl(mappedTypeAsClauses.ts, 32, 13))
>K : Symbol(K, Decl(mappedTypeAsClauses.ts, 33, 5))
@@ -1,7 +1,7 @@
=== tests/cases/conformance/types/mapped/mappedTypeAsClauses.ts ===
// Mapped type 'as N' clauses
type Getters<T> = { [P in keyof T & string as `get${capitalize P}`]: () => T[P] };
type Getters<T> = { [P in keyof T & string as `get${Capitalize<P>}`]: () => T[P] };
>Getters : Getters<T>
type TG1 = Getters<{ foo: string, bar: number, baz: { z: boolean } }>;
@@ -71,7 +71,7 @@ type TD3<U> = keyof DoubleProp<U>; // `${keyof U & string}1` | `${keyof U & str
type Lazyify<T> = {
>Lazyify : Lazyify<T>
[K in keyof T as `get${capitalize string & K}`]: () => T[K]
[K in keyof T as `get${Capitalize<K & string>}`]: () => T[K]
};
interface Person {
@@ -1,5 +1,5 @@
tests/cases/conformance/types/literal/templateLiteralTypes1.ts(34,5): error TS2322: Type 'T' is not assignable to type '{ [P in keyof T & string as `p_${P}`]: T[P]; }'.
tests/cases/conformance/types/literal/templateLiteralTypes1.ts(39,5): error TS2322: Type '{ [P in B as `p_${P}`]: T; }' is not assignable to type '{ [Q in A as `p_${Q}`]: U; }'.
tests/cases/conformance/types/literal/templateLiteralTypes1.ts(40,5): error TS2322: Type 'T' is not assignable to type '{ [P in keyof T & string as `p_${P}`]: T[P]; }'.
tests/cases/conformance/types/literal/templateLiteralTypes1.ts(45,5): error TS2322: Type '{ [P in B as `p_${P}`]: T; }' is not assignable to type '{ [Q in A as `p_${Q}`]: U; }'.
Type 'A' is not assignable to type 'B'.
'A' is assignable to the constraint of type 'B', but 'B' could be instantiated with a different subtype of constraint 'string'.
Type 'string' is not assignable to type 'B'.
@@ -28,16 +28,22 @@ tests/cases/conformance/types/literal/templateLiteralTypes1.ts(205,16): error TS
type ToString<T extends string | number | boolean | bigint> = `${T}`;
type TS1 = ToString<'abc' | 42 | true | -1234n>;
// Casing modifiers
// Nested template literal type normalization
type Cases<T extends string> = `${uppercase T} ${lowercase T} ${capitalize T} ${uncapitalize T}`;
type TL1<T extends string> = `a${T}b${T}c`;
type TL2<U extends string> = TL1<`x${U}y`>; // `ax${U}ybx{$U}yc`
type TL3 = TL2<'o'>; // 'axoybxoyc'
// Casing intrinsics
type Cases<T extends string> = `${Uppercase<T>} ${Lowercase<T>} ${Capitalize<T>} ${Uncapitalize<T>}`;
type TCA1 = Cases<'bar'>; // 'BAR bar Bar bar'
type TCA2 = Cases<'BAR'>; // 'BAR bar BAR bAR'
// Assignability
function test<T extends 'foo' | 'bar'>(name: `get${capitalize T}`) {
function test<T extends 'foo' | 'bar'>(name: `get${Capitalize<T>}`) {
let s1: string = name;
let s2: 'getFoo' | 'getBar' = name;
}
@@ -83,14 +89,14 @@ tests/cases/conformance/types/literal/templateLiteralTypes1.ts(205,16): error TS
type T24 = MatchPair<'[1,2,3,4]'>; // ['1', '2,3,4']
type SnakeToCamelCase<S extends string> =
S extends `${infer T}_${infer U}` ? `${lowercase T}${SnakeToPascalCase<U>}` :
S extends `${infer T}` ? `${lowercase T}` :
S extends `${infer T}_${infer U}` ? `${Lowercase<T>}${SnakeToPascalCase<U>}` :
S extends `${infer T}` ? `${Lowercase<T>}` :
SnakeToPascalCase<S>;
type SnakeToPascalCase<S extends string> =
string extends S ? string :
S extends `${infer T}_${infer U}` ? `${capitalize `${lowercase T}`}${SnakeToPascalCase<U>}` :
S extends `${infer T}` ? `${capitalize `${lowercase T}`}` :
S extends `${infer T}_${infer U}` ? `${Capitalize<Lowercase<T>>}${SnakeToPascalCase<U>}` :
S extends `${infer T}` ? `${Capitalize<Lowercase<T>>}` :
never;
type RR0 = SnakeToPascalCase<'hello_world_foo'>; // 'HelloWorldFoo'
@@ -106,12 +112,6 @@ tests/cases/conformance/types/literal/templateLiteralTypes1.ts(205,16): error TS
type T26 = FirstTwoAndRest<'ab'>; // ['ab', '']
type T27 = FirstTwoAndRest<'a'>; // unknown
type Capitalize<S extends string> = S extends `${infer H}${infer T}` ? `${uppercase H}${T}` : S;
type Uncapitalize<S extends string> = S extends `${infer H}${infer T}` ? `${lowercase H}${T}` : S;
type TC1 = Capitalize<'foo'>; // 'Foo'
type TC2 = Uncapitalize<'Foo'>; // 'foo'
type HexDigit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' |'8' | '9' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f';
type HexColor<S extends string> =
@@ -16,16 +16,22 @@ type Loc = `${'top' | 'middle' | 'bottom'}-${'left' | 'center' | 'right'}`;
type ToString<T extends string | number | boolean | bigint> = `${T}`;
type TS1 = ToString<'abc' | 42 | true | -1234n>;
// Casing modifiers
// Nested template literal type normalization
type Cases<T extends string> = `${uppercase T} ${lowercase T} ${capitalize T} ${uncapitalize T}`;
type TL1<T extends string> = `a${T}b${T}c`;
type TL2<U extends string> = TL1<`x${U}y`>; // `ax${U}ybx{$U}yc`
type TL3 = TL2<'o'>; // 'axoybxoyc'
// Casing intrinsics
type Cases<T extends string> = `${Uppercase<T>} ${Lowercase<T>} ${Capitalize<T>} ${Uncapitalize<T>}`;
type TCA1 = Cases<'bar'>; // 'BAR bar Bar bar'
type TCA2 = Cases<'BAR'>; // 'BAR bar BAR bAR'
// Assignability
function test<T extends 'foo' | 'bar'>(name: `get${capitalize T}`) {
function test<T extends 'foo' | 'bar'>(name: `get${Capitalize<T>}`) {
let s1: string = name;
let s2: 'getFoo' | 'getBar' = name;
}
@@ -63,14 +69,14 @@ type T23 = MatchPair<'[123]'>; // unknown
type T24 = MatchPair<'[1,2,3,4]'>; // ['1', '2,3,4']
type SnakeToCamelCase<S extends string> =
S extends `${infer T}_${infer U}` ? `${lowercase T}${SnakeToPascalCase<U>}` :
S extends `${infer T}` ? `${lowercase T}` :
S extends `${infer T}_${infer U}` ? `${Lowercase<T>}${SnakeToPascalCase<U>}` :
S extends `${infer T}` ? `${Lowercase<T>}` :
SnakeToPascalCase<S>;
type SnakeToPascalCase<S extends string> =
string extends S ? string :
S extends `${infer T}_${infer U}` ? `${capitalize `${lowercase T}`}${SnakeToPascalCase<U>}` :
S extends `${infer T}` ? `${capitalize `${lowercase T}`}` :
S extends `${infer T}_${infer U}` ? `${Capitalize<Lowercase<T>>}${SnakeToPascalCase<U>}` :
S extends `${infer T}` ? `${Capitalize<Lowercase<T>>}` :
never;
type RR0 = SnakeToPascalCase<'hello_world_foo'>; // 'HelloWorldFoo'
@@ -86,12 +92,6 @@ type T25 = FirstTwoAndRest<'abcde'>; // ['ab', 'cde']
type T26 = FirstTwoAndRest<'ab'>; // ['ab', '']
type T27 = FirstTwoAndRest<'a'>; // unknown
type Capitalize<S extends string> = S extends `${infer H}${infer T}` ? `${uppercase H}${T}` : S;
type Uncapitalize<S extends string> = S extends `${infer H}${infer T}` ? `${lowercase H}${T}` : S;
type TC1 = Capitalize<'foo'>; // 'Foo'
type TC2 = Uncapitalize<'Foo'>; // 'foo'
type HexDigit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' |'8' | '9' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f';
type HexColor<S extends string> =
@@ -245,10 +245,13 @@ declare type EN1 = EventName<'Foo' | 'Bar' | 'Baz'>;
declare type Loc = `${'top' | 'middle' | 'bottom'}-${'left' | 'center' | 'right'}`;
declare type ToString<T extends string | number | boolean | bigint> = `${T}`;
declare type TS1 = ToString<'abc' | 42 | true | -1234n>;
declare type Cases<T extends string> = `${uppercase T} ${lowercase T} ${capitalize T} ${uncapitalize T}`;
declare type TL1<T extends string> = `a${T}b${T}c`;
declare type TL2<U extends string> = TL1<`x${U}y`>;
declare type TL3 = TL2<'o'>;
declare type Cases<T extends string> = `${Uppercase<T>} ${Lowercase<T>} ${Capitalize<T>} ${Uncapitalize<T>}`;
declare type TCA1 = Cases<'bar'>;
declare type TCA2 = Cases<'BAR'>;
declare function test<T extends 'foo' | 'bar'>(name: `get${capitalize T}`): void;
declare function test<T extends 'foo' | 'bar'>(name: `get${Capitalize<T>}`): void;
declare function fa1<T>(x: T, y: {
[P in keyof T]: T[P];
}, z: {
@@ -269,8 +272,8 @@ declare type T21 = MatchPair<'[foo,bar]'>;
declare type T22 = MatchPair<' [1,2]'>;
declare type T23 = MatchPair<'[123]'>;
declare type T24 = MatchPair<'[1,2,3,4]'>;
declare type SnakeToCamelCase<S extends string> = S extends `${infer T}_${infer U}` ? `${lowercase T}${SnakeToPascalCase<U>}` : S extends `${infer T}` ? `${lowercase T}` : SnakeToPascalCase<S>;
declare type SnakeToPascalCase<S extends string> = string extends S ? string : S extends `${infer T}_${infer U}` ? `${capitalize `${lowercase T}`}${SnakeToPascalCase<U>}` : S extends `${infer T}` ? `${capitalize `${lowercase T}`}` : never;
declare type SnakeToCamelCase<S extends string> = S extends `${infer T}_${infer U}` ? `${Lowercase<T>}${SnakeToPascalCase<U>}` : S extends `${infer T}` ? `${Lowercase<T>}` : SnakeToPascalCase<S>;
declare type SnakeToPascalCase<S extends string> = string extends S ? string : S extends `${infer T}_${infer U}` ? `${Capitalize<Lowercase<T>>}${SnakeToPascalCase<U>}` : S extends `${infer T}` ? `${Capitalize<Lowercase<T>>}` : never;
declare type RR0 = SnakeToPascalCase<'hello_world_foo'>;
declare type RR1 = SnakeToPascalCase<'FOO_BAR_BAZ'>;
declare type RR2 = SnakeToCamelCase<'hello_world_foo'>;
@@ -279,10 +282,6 @@ declare type FirstTwoAndRest<S extends string> = S extends `${infer A}${infer B}
declare type T25 = FirstTwoAndRest<'abcde'>;
declare type T26 = FirstTwoAndRest<'ab'>;
declare type T27 = FirstTwoAndRest<'a'>;
declare type Capitalize<S extends string> = S extends `${infer H}${infer T}` ? `${uppercase H}${T}` : S;
declare type Uncapitalize<S extends string> = S extends `${infer H}${infer T}` ? `${lowercase H}${T}` : S;
declare type TC1 = Capitalize<'foo'>;
declare type TC2 = Uncapitalize<'Foo'>;
declare type HexDigit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f';
declare type HexColor<S extends string> = S extends `#${infer R1}${infer R2}${infer G1}${infer G2}${infer B1}${infer B2}` ? [
R1,
@@ -47,277 +47,278 @@ type TS1 = ToString<'abc' | 42 | true | -1234n>;
>TS1 : Symbol(TS1, Decl(templateLiteralTypes1.ts, 14, 69))
>ToString : Symbol(ToString, Decl(templateLiteralTypes1.ts, 10, 75))
// Casing modifiers
// Nested template literal type normalization
type Cases<T extends string> = `${uppercase T} ${lowercase T} ${capitalize T} ${uncapitalize T}`;
>Cases : Symbol(Cases, Decl(templateLiteralTypes1.ts, 15, 48))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 19, 11))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 19, 11))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 19, 11))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 19, 11))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 19, 11))
type TL1<T extends string> = `a${T}b${T}c`;
>TL1 : Symbol(TL1, Decl(templateLiteralTypes1.ts, 15, 48))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 19, 9))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 19, 9))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 19, 9))
type TL2<U extends string> = TL1<`x${U}y`>; // `ax${U}ybx{$U}yc`
>TL2 : Symbol(TL2, Decl(templateLiteralTypes1.ts, 19, 43))
>U : Symbol(U, Decl(templateLiteralTypes1.ts, 20, 9))
>TL1 : Symbol(TL1, Decl(templateLiteralTypes1.ts, 15, 48))
>U : Symbol(U, Decl(templateLiteralTypes1.ts, 20, 9))
type TL3 = TL2<'o'>; // 'axoybxoyc'
>TL3 : Symbol(TL3, Decl(templateLiteralTypes1.ts, 20, 43))
>TL2 : Symbol(TL2, Decl(templateLiteralTypes1.ts, 19, 43))
// Casing intrinsics
type Cases<T extends string> = `${Uppercase<T>} ${Lowercase<T>} ${Capitalize<T>} ${Uncapitalize<T>}`;
>Cases : Symbol(Cases, Decl(templateLiteralTypes1.ts, 21, 20))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 25, 11))
>Uppercase : Symbol(Uppercase, Decl(lib.es5.d.ts, --, --))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 25, 11))
>Lowercase : Symbol(Lowercase, Decl(lib.es5.d.ts, --, --))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 25, 11))
>Capitalize : Symbol(Capitalize, Decl(lib.es5.d.ts, --, --))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 25, 11))
>Uncapitalize : Symbol(Uncapitalize, Decl(lib.es5.d.ts, --, --))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 25, 11))
type TCA1 = Cases<'bar'>; // 'BAR bar Bar bar'
>TCA1 : Symbol(TCA1, Decl(templateLiteralTypes1.ts, 19, 97))
>Cases : Symbol(Cases, Decl(templateLiteralTypes1.ts, 15, 48))
>TCA1 : Symbol(TCA1, Decl(templateLiteralTypes1.ts, 25, 101))
>Cases : Symbol(Cases, Decl(templateLiteralTypes1.ts, 21, 20))
type TCA2 = Cases<'BAR'>; // 'BAR bar BAR bAR'
>TCA2 : Symbol(TCA2, Decl(templateLiteralTypes1.ts, 21, 25))
>Cases : Symbol(Cases, Decl(templateLiteralTypes1.ts, 15, 48))
>TCA2 : Symbol(TCA2, Decl(templateLiteralTypes1.ts, 27, 25))
>Cases : Symbol(Cases, Decl(templateLiteralTypes1.ts, 21, 20))
// Assignability
function test<T extends 'foo' | 'bar'>(name: `get${capitalize T}`) {
>test : Symbol(test, Decl(templateLiteralTypes1.ts, 22, 25))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 26, 14))
>name : Symbol(name, Decl(templateLiteralTypes1.ts, 26, 39))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 26, 14))
function test<T extends 'foo' | 'bar'>(name: `get${Capitalize<T>}`) {
>test : Symbol(test, Decl(templateLiteralTypes1.ts, 28, 25))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 32, 14))
>name : Symbol(name, Decl(templateLiteralTypes1.ts, 32, 39))
>Capitalize : Symbol(Capitalize, Decl(lib.es5.d.ts, --, --))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 32, 14))
let s1: string = name;
>s1 : Symbol(s1, Decl(templateLiteralTypes1.ts, 27, 7))
>name : Symbol(name, Decl(templateLiteralTypes1.ts, 26, 39))
>s1 : Symbol(s1, Decl(templateLiteralTypes1.ts, 33, 7))
>name : Symbol(name, Decl(templateLiteralTypes1.ts, 32, 39))
let s2: 'getFoo' | 'getBar' = name;
>s2 : Symbol(s2, Decl(templateLiteralTypes1.ts, 28, 7))
>name : Symbol(name, Decl(templateLiteralTypes1.ts, 26, 39))
>s2 : Symbol(s2, Decl(templateLiteralTypes1.ts, 34, 7))
>name : Symbol(name, Decl(templateLiteralTypes1.ts, 32, 39))
}
function fa1<T>(x: T, y: { [P in keyof T]: T[P] }, z: { [P in keyof T & string as `p_${P}`]: T[P] }) {
>fa1 : Symbol(fa1, Decl(templateLiteralTypes1.ts, 29, 1))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 31, 13))
>x : Symbol(x, Decl(templateLiteralTypes1.ts, 31, 16))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 31, 13))
>y : Symbol(y, Decl(templateLiteralTypes1.ts, 31, 21))
>P : Symbol(P, Decl(templateLiteralTypes1.ts, 31, 28))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 31, 13))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 31, 13))
>P : Symbol(P, Decl(templateLiteralTypes1.ts, 31, 28))
>z : Symbol(z, Decl(templateLiteralTypes1.ts, 31, 50))
>P : Symbol(P, Decl(templateLiteralTypes1.ts, 31, 57))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 31, 13))
>P : Symbol(P, Decl(templateLiteralTypes1.ts, 31, 57))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 31, 13))
>P : Symbol(P, Decl(templateLiteralTypes1.ts, 31, 57))
>fa1 : Symbol(fa1, Decl(templateLiteralTypes1.ts, 35, 1))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 37, 13))
>x : Symbol(x, Decl(templateLiteralTypes1.ts, 37, 16))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 37, 13))
>y : Symbol(y, Decl(templateLiteralTypes1.ts, 37, 21))
>P : Symbol(P, Decl(templateLiteralTypes1.ts, 37, 28))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 37, 13))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 37, 13))
>P : Symbol(P, Decl(templateLiteralTypes1.ts, 37, 28))
>z : Symbol(z, Decl(templateLiteralTypes1.ts, 37, 50))
>P : Symbol(P, Decl(templateLiteralTypes1.ts, 37, 57))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 37, 13))
>P : Symbol(P, Decl(templateLiteralTypes1.ts, 37, 57))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 37, 13))
>P : Symbol(P, Decl(templateLiteralTypes1.ts, 37, 57))
y = x;
>y : Symbol(y, Decl(templateLiteralTypes1.ts, 31, 21))
>x : Symbol(x, Decl(templateLiteralTypes1.ts, 31, 16))
>y : Symbol(y, Decl(templateLiteralTypes1.ts, 37, 21))
>x : Symbol(x, Decl(templateLiteralTypes1.ts, 37, 16))
z = x; // Error
>z : Symbol(z, Decl(templateLiteralTypes1.ts, 31, 50))
>x : Symbol(x, Decl(templateLiteralTypes1.ts, 31, 16))
>z : Symbol(z, Decl(templateLiteralTypes1.ts, 37, 50))
>x : Symbol(x, Decl(templateLiteralTypes1.ts, 37, 16))
}
function fa2<T, U extends T, A extends string, B extends A>(x: { [P in B as `p_${P}`]: T }, y: { [Q in A as `p_${Q}`]: U }) {
>fa2 : Symbol(fa2, Decl(templateLiteralTypes1.ts, 34, 1))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 36, 13))
>U : Symbol(U, Decl(templateLiteralTypes1.ts, 36, 15))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 36, 13))
>A : Symbol(A, Decl(templateLiteralTypes1.ts, 36, 28))
>B : Symbol(B, Decl(templateLiteralTypes1.ts, 36, 46))
>A : Symbol(A, Decl(templateLiteralTypes1.ts, 36, 28))
>x : Symbol(x, Decl(templateLiteralTypes1.ts, 36, 60))
>P : Symbol(P, Decl(templateLiteralTypes1.ts, 36, 66))
>B : Symbol(B, Decl(templateLiteralTypes1.ts, 36, 46))
>P : Symbol(P, Decl(templateLiteralTypes1.ts, 36, 66))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 36, 13))
>y : Symbol(y, Decl(templateLiteralTypes1.ts, 36, 91))
>Q : Symbol(Q, Decl(templateLiteralTypes1.ts, 36, 98))
>A : Symbol(A, Decl(templateLiteralTypes1.ts, 36, 28))
>Q : Symbol(Q, Decl(templateLiteralTypes1.ts, 36, 98))
>U : Symbol(U, Decl(templateLiteralTypes1.ts, 36, 15))
>fa2 : Symbol(fa2, Decl(templateLiteralTypes1.ts, 40, 1))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 42, 13))
>U : Symbol(U, Decl(templateLiteralTypes1.ts, 42, 15))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 42, 13))
>A : Symbol(A, Decl(templateLiteralTypes1.ts, 42, 28))
>B : Symbol(B, Decl(templateLiteralTypes1.ts, 42, 46))
>A : Symbol(A, Decl(templateLiteralTypes1.ts, 42, 28))
>x : Symbol(x, Decl(templateLiteralTypes1.ts, 42, 60))
>P : Symbol(P, Decl(templateLiteralTypes1.ts, 42, 66))
>B : Symbol(B, Decl(templateLiteralTypes1.ts, 42, 46))
>P : Symbol(P, Decl(templateLiteralTypes1.ts, 42, 66))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 42, 13))
>y : Symbol(y, Decl(templateLiteralTypes1.ts, 42, 91))
>Q : Symbol(Q, Decl(templateLiteralTypes1.ts, 42, 98))
>A : Symbol(A, Decl(templateLiteralTypes1.ts, 42, 28))
>Q : Symbol(Q, Decl(templateLiteralTypes1.ts, 42, 98))
>U : Symbol(U, Decl(templateLiteralTypes1.ts, 42, 15))
x = y;
>x : Symbol(x, Decl(templateLiteralTypes1.ts, 36, 60))
>y : Symbol(y, Decl(templateLiteralTypes1.ts, 36, 91))
>x : Symbol(x, Decl(templateLiteralTypes1.ts, 42, 60))
>y : Symbol(y, Decl(templateLiteralTypes1.ts, 42, 91))
y = x; // Error
>y : Symbol(y, Decl(templateLiteralTypes1.ts, 36, 91))
>x : Symbol(x, Decl(templateLiteralTypes1.ts, 36, 60))
>y : Symbol(y, Decl(templateLiteralTypes1.ts, 42, 91))
>x : Symbol(x, Decl(templateLiteralTypes1.ts, 42, 60))
}
// String transformations using recursive conditional types
type Join<T extends unknown[], D extends string> =
>Join : Symbol(Join, Decl(templateLiteralTypes1.ts, 39, 1))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 43, 10))
>D : Symbol(D, Decl(templateLiteralTypes1.ts, 43, 30))
>Join : Symbol(Join, Decl(templateLiteralTypes1.ts, 45, 1))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 49, 10))
>D : Symbol(D, Decl(templateLiteralTypes1.ts, 49, 30))
T extends [] ? '' :
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 43, 10))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 49, 10))
T extends [string | number | boolean | bigint] ? `${T[0]}` :
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 43, 10))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 43, 10))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 49, 10))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 49, 10))
T extends [string | number | boolean | bigint, ...infer U] ? `${T[0]}${D}${Join<U, D>}` :
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 43, 10))
>U : Symbol(U, Decl(templateLiteralTypes1.ts, 46, 59))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 43, 10))
>D : Symbol(D, Decl(templateLiteralTypes1.ts, 43, 30))
>Join : Symbol(Join, Decl(templateLiteralTypes1.ts, 39, 1))
>U : Symbol(U, Decl(templateLiteralTypes1.ts, 46, 59))
>D : Symbol(D, Decl(templateLiteralTypes1.ts, 43, 30))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 49, 10))
>U : Symbol(U, Decl(templateLiteralTypes1.ts, 52, 59))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 49, 10))
>D : Symbol(D, Decl(templateLiteralTypes1.ts, 49, 30))
>Join : Symbol(Join, Decl(templateLiteralTypes1.ts, 45, 1))
>U : Symbol(U, Decl(templateLiteralTypes1.ts, 52, 59))
>D : Symbol(D, Decl(templateLiteralTypes1.ts, 49, 30))
string;
type TJ1 = Join<[1, 2, 3, 4], '.'>
>TJ1 : Symbol(TJ1, Decl(templateLiteralTypes1.ts, 47, 11))
>Join : Symbol(Join, Decl(templateLiteralTypes1.ts, 39, 1))
>TJ1 : Symbol(TJ1, Decl(templateLiteralTypes1.ts, 53, 11))
>Join : Symbol(Join, Decl(templateLiteralTypes1.ts, 45, 1))
type TJ2 = Join<['foo', 'bar', 'baz'], '-'>;
>TJ2 : Symbol(TJ2, Decl(templateLiteralTypes1.ts, 49, 34))
>Join : Symbol(Join, Decl(templateLiteralTypes1.ts, 39, 1))
>TJ2 : Symbol(TJ2, Decl(templateLiteralTypes1.ts, 55, 34))
>Join : Symbol(Join, Decl(templateLiteralTypes1.ts, 45, 1))
type TJ3 = Join<[], '.'>
>TJ3 : Symbol(TJ3, Decl(templateLiteralTypes1.ts, 50, 44))
>Join : Symbol(Join, Decl(templateLiteralTypes1.ts, 39, 1))
>TJ3 : Symbol(TJ3, Decl(templateLiteralTypes1.ts, 56, 44))
>Join : Symbol(Join, Decl(templateLiteralTypes1.ts, 45, 1))
// Inference based on delimiters
type MatchPair<S extends string> = S extends `[${infer A},${infer B}]` ? [A, B] : unknown;
>MatchPair : Symbol(MatchPair, Decl(templateLiteralTypes1.ts, 51, 24))
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 55, 15))
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 55, 15))
>A : Symbol(A, Decl(templateLiteralTypes1.ts, 55, 54))
>B : Symbol(B, Decl(templateLiteralTypes1.ts, 55, 65))
>A : Symbol(A, Decl(templateLiteralTypes1.ts, 55, 54))
>B : Symbol(B, Decl(templateLiteralTypes1.ts, 55, 65))
>MatchPair : Symbol(MatchPair, Decl(templateLiteralTypes1.ts, 57, 24))
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 61, 15))
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 61, 15))
>A : Symbol(A, Decl(templateLiteralTypes1.ts, 61, 54))
>B : Symbol(B, Decl(templateLiteralTypes1.ts, 61, 65))
>A : Symbol(A, Decl(templateLiteralTypes1.ts, 61, 54))
>B : Symbol(B, Decl(templateLiteralTypes1.ts, 61, 65))
type T20 = MatchPair<'[1,2]'>; // ['1', '2']
>T20 : Symbol(T20, Decl(templateLiteralTypes1.ts, 55, 90))
>MatchPair : Symbol(MatchPair, Decl(templateLiteralTypes1.ts, 51, 24))
>T20 : Symbol(T20, Decl(templateLiteralTypes1.ts, 61, 90))
>MatchPair : Symbol(MatchPair, Decl(templateLiteralTypes1.ts, 57, 24))
type T21 = MatchPair<'[foo,bar]'>; // ['foo', 'bar']
>T21 : Symbol(T21, Decl(templateLiteralTypes1.ts, 57, 30))
>MatchPair : Symbol(MatchPair, Decl(templateLiteralTypes1.ts, 51, 24))
>T21 : Symbol(T21, Decl(templateLiteralTypes1.ts, 63, 30))
>MatchPair : Symbol(MatchPair, Decl(templateLiteralTypes1.ts, 57, 24))
type T22 = MatchPair<' [1,2]'>; // unknown
>T22 : Symbol(T22, Decl(templateLiteralTypes1.ts, 58, 34))
>MatchPair : Symbol(MatchPair, Decl(templateLiteralTypes1.ts, 51, 24))
>T22 : Symbol(T22, Decl(templateLiteralTypes1.ts, 64, 34))
>MatchPair : Symbol(MatchPair, Decl(templateLiteralTypes1.ts, 57, 24))
type T23 = MatchPair<'[123]'>; // unknown
>T23 : Symbol(T23, Decl(templateLiteralTypes1.ts, 59, 31))
>MatchPair : Symbol(MatchPair, Decl(templateLiteralTypes1.ts, 51, 24))
>T23 : Symbol(T23, Decl(templateLiteralTypes1.ts, 65, 31))
>MatchPair : Symbol(MatchPair, Decl(templateLiteralTypes1.ts, 57, 24))
type T24 = MatchPair<'[1,2,3,4]'>; // ['1', '2,3,4']
>T24 : Symbol(T24, Decl(templateLiteralTypes1.ts, 60, 30))
>MatchPair : Symbol(MatchPair, Decl(templateLiteralTypes1.ts, 51, 24))
>T24 : Symbol(T24, Decl(templateLiteralTypes1.ts, 66, 30))
>MatchPair : Symbol(MatchPair, Decl(templateLiteralTypes1.ts, 57, 24))
type SnakeToCamelCase<S extends string> =
>SnakeToCamelCase : Symbol(SnakeToCamelCase, Decl(templateLiteralTypes1.ts, 61, 34))
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 63, 22))
>SnakeToCamelCase : Symbol(SnakeToCamelCase, Decl(templateLiteralTypes1.ts, 67, 34))
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 69, 22))
S extends `${infer T}_${infer U}` ? `${lowercase T}${SnakeToPascalCase<U>}` :
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 63, 22))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 64, 22))
>U : Symbol(U, Decl(templateLiteralTypes1.ts, 64, 33))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 64, 22))
>SnakeToPascalCase : Symbol(SnakeToPascalCase, Decl(templateLiteralTypes1.ts, 66, 25))
>U : Symbol(U, Decl(templateLiteralTypes1.ts, 64, 33))
S extends `${infer T}_${infer U}` ? `${Lowercase<T>}${SnakeToPascalCase<U>}` :
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 69, 22))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 70, 22))
>U : Symbol(U, Decl(templateLiteralTypes1.ts, 70, 33))
>Lowercase : Symbol(Lowercase, Decl(lib.es5.d.ts, --, --))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 70, 22))
>SnakeToPascalCase : Symbol(SnakeToPascalCase, Decl(templateLiteralTypes1.ts, 72, 25))
>U : Symbol(U, Decl(templateLiteralTypes1.ts, 70, 33))
S extends `${infer T}` ? `${lowercase T}` :
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 63, 22))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 65, 22))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 65, 22))
S extends `${infer T}` ? `${Lowercase<T>}` :
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 69, 22))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 71, 22))
>Lowercase : Symbol(Lowercase, Decl(lib.es5.d.ts, --, --))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 71, 22))
SnakeToPascalCase<S>;
>SnakeToPascalCase : Symbol(SnakeToPascalCase, Decl(templateLiteralTypes1.ts, 66, 25))
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 63, 22))
>SnakeToPascalCase : Symbol(SnakeToPascalCase, Decl(templateLiteralTypes1.ts, 72, 25))
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 69, 22))
type SnakeToPascalCase<S extends string> =
>SnakeToPascalCase : Symbol(SnakeToPascalCase, Decl(templateLiteralTypes1.ts, 66, 25))
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 68, 23))
>SnakeToPascalCase : Symbol(SnakeToPascalCase, Decl(templateLiteralTypes1.ts, 72, 25))
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 74, 23))
string extends S ? string :
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 68, 23))
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 74, 23))
S extends `${infer T}_${infer U}` ? `${capitalize `${lowercase T}`}${SnakeToPascalCase<U>}` :
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 68, 23))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 70, 22))
>U : Symbol(U, Decl(templateLiteralTypes1.ts, 70, 33))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 70, 22))
>SnakeToPascalCase : Symbol(SnakeToPascalCase, Decl(templateLiteralTypes1.ts, 66, 25))
>U : Symbol(U, Decl(templateLiteralTypes1.ts, 70, 33))
S extends `${infer T}_${infer U}` ? `${Capitalize<Lowercase<T>>}${SnakeToPascalCase<U>}` :
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 74, 23))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 76, 22))
>U : Symbol(U, Decl(templateLiteralTypes1.ts, 76, 33))
>Capitalize : Symbol(Capitalize, Decl(lib.es5.d.ts, --, --))
>Lowercase : Symbol(Lowercase, Decl(lib.es5.d.ts, --, --))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 76, 22))
>SnakeToPascalCase : Symbol(SnakeToPascalCase, Decl(templateLiteralTypes1.ts, 72, 25))
>U : Symbol(U, Decl(templateLiteralTypes1.ts, 76, 33))
S extends `${infer T}` ? `${capitalize `${lowercase T}`}` :
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 68, 23))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 71, 22))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 71, 22))
S extends `${infer T}` ? `${Capitalize<Lowercase<T>>}` :
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 74, 23))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 77, 22))
>Capitalize : Symbol(Capitalize, Decl(lib.es5.d.ts, --, --))
>Lowercase : Symbol(Lowercase, Decl(lib.es5.d.ts, --, --))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 77, 22))
never;
type RR0 = SnakeToPascalCase<'hello_world_foo'>; // 'HelloWorldFoo'
>RR0 : Symbol(RR0, Decl(templateLiteralTypes1.ts, 72, 10))
>SnakeToPascalCase : Symbol(SnakeToPascalCase, Decl(templateLiteralTypes1.ts, 66, 25))
>RR0 : Symbol(RR0, Decl(templateLiteralTypes1.ts, 78, 10))
>SnakeToPascalCase : Symbol(SnakeToPascalCase, Decl(templateLiteralTypes1.ts, 72, 25))
type RR1 = SnakeToPascalCase<'FOO_BAR_BAZ'>; // 'FooBarBaz'
>RR1 : Symbol(RR1, Decl(templateLiteralTypes1.ts, 74, 48))
>SnakeToPascalCase : Symbol(SnakeToPascalCase, Decl(templateLiteralTypes1.ts, 66, 25))
>RR1 : Symbol(RR1, Decl(templateLiteralTypes1.ts, 80, 48))
>SnakeToPascalCase : Symbol(SnakeToPascalCase, Decl(templateLiteralTypes1.ts, 72, 25))
type RR2 = SnakeToCamelCase<'hello_world_foo'>; // 'helloWorldFoo'
>RR2 : Symbol(RR2, Decl(templateLiteralTypes1.ts, 75, 44))
>SnakeToCamelCase : Symbol(SnakeToCamelCase, Decl(templateLiteralTypes1.ts, 61, 34))
>RR2 : Symbol(RR2, Decl(templateLiteralTypes1.ts, 81, 44))
>SnakeToCamelCase : Symbol(SnakeToCamelCase, Decl(templateLiteralTypes1.ts, 67, 34))
type RR3 = SnakeToCamelCase<'FOO_BAR_BAZ'>; // 'fooBarBaz'
>RR3 : Symbol(RR3, Decl(templateLiteralTypes1.ts, 76, 47))
>SnakeToCamelCase : Symbol(SnakeToCamelCase, Decl(templateLiteralTypes1.ts, 61, 34))
>RR3 : Symbol(RR3, Decl(templateLiteralTypes1.ts, 82, 47))
>SnakeToCamelCase : Symbol(SnakeToCamelCase, Decl(templateLiteralTypes1.ts, 67, 34))
// Single character inference
type FirstTwoAndRest<S extends string> = S extends `${infer A}${infer B}${infer R}` ? [`${A}${B}`, R] : unknown;
>FirstTwoAndRest : Symbol(FirstTwoAndRest, Decl(templateLiteralTypes1.ts, 77, 43))
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 81, 21))
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 81, 21))
>A : Symbol(A, Decl(templateLiteralTypes1.ts, 81, 59))
>B : Symbol(B, Decl(templateLiteralTypes1.ts, 81, 69))
>R : Symbol(R, Decl(templateLiteralTypes1.ts, 81, 79))
>A : Symbol(A, Decl(templateLiteralTypes1.ts, 81, 59))
>B : Symbol(B, Decl(templateLiteralTypes1.ts, 81, 69))
>R : Symbol(R, Decl(templateLiteralTypes1.ts, 81, 79))
>FirstTwoAndRest : Symbol(FirstTwoAndRest, Decl(templateLiteralTypes1.ts, 83, 43))
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 87, 21))
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 87, 21))
>A : Symbol(A, Decl(templateLiteralTypes1.ts, 87, 59))
>B : Symbol(B, Decl(templateLiteralTypes1.ts, 87, 69))
>R : Symbol(R, Decl(templateLiteralTypes1.ts, 87, 79))
>A : Symbol(A, Decl(templateLiteralTypes1.ts, 87, 59))
>B : Symbol(B, Decl(templateLiteralTypes1.ts, 87, 69))
>R : Symbol(R, Decl(templateLiteralTypes1.ts, 87, 79))
type T25 = FirstTwoAndRest<'abcde'>; // ['ab', 'cde']
>T25 : Symbol(T25, Decl(templateLiteralTypes1.ts, 81, 112))
>FirstTwoAndRest : Symbol(FirstTwoAndRest, Decl(templateLiteralTypes1.ts, 77, 43))
>T25 : Symbol(T25, Decl(templateLiteralTypes1.ts, 87, 112))
>FirstTwoAndRest : Symbol(FirstTwoAndRest, Decl(templateLiteralTypes1.ts, 83, 43))
type T26 = FirstTwoAndRest<'ab'>; // ['ab', '']
>T26 : Symbol(T26, Decl(templateLiteralTypes1.ts, 83, 36))
>FirstTwoAndRest : Symbol(FirstTwoAndRest, Decl(templateLiteralTypes1.ts, 77, 43))
>T26 : Symbol(T26, Decl(templateLiteralTypes1.ts, 89, 36))
>FirstTwoAndRest : Symbol(FirstTwoAndRest, Decl(templateLiteralTypes1.ts, 83, 43))
type T27 = FirstTwoAndRest<'a'>; // unknown
>T27 : Symbol(T27, Decl(templateLiteralTypes1.ts, 84, 33))
>FirstTwoAndRest : Symbol(FirstTwoAndRest, Decl(templateLiteralTypes1.ts, 77, 43))
type Capitalize<S extends string> = S extends `${infer H}${infer T}` ? `${uppercase H}${T}` : S;
>Capitalize : Symbol(Capitalize, Decl(templateLiteralTypes1.ts, 85, 32))
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 87, 16))
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 87, 16))
>H : Symbol(H, Decl(templateLiteralTypes1.ts, 87, 54))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 87, 64))
>H : Symbol(H, Decl(templateLiteralTypes1.ts, 87, 54))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 87, 64))
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 87, 16))
type Uncapitalize<S extends string> = S extends `${infer H}${infer T}` ? `${lowercase H}${T}` : S;
>Uncapitalize : Symbol(Uncapitalize, Decl(templateLiteralTypes1.ts, 87, 96))
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 88, 18))
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 88, 18))
>H : Symbol(H, Decl(templateLiteralTypes1.ts, 88, 56))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 88, 66))
>H : Symbol(H, Decl(templateLiteralTypes1.ts, 88, 56))
>T : Symbol(T, Decl(templateLiteralTypes1.ts, 88, 66))
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 88, 18))
type TC1 = Capitalize<'foo'>; // 'Foo'
>TC1 : Symbol(TC1, Decl(templateLiteralTypes1.ts, 88, 98))
>Capitalize : Symbol(Capitalize, Decl(templateLiteralTypes1.ts, 85, 32))
type TC2 = Uncapitalize<'Foo'>; // 'foo'
>TC2 : Symbol(TC2, Decl(templateLiteralTypes1.ts, 90, 29))
>Uncapitalize : Symbol(Uncapitalize, Decl(templateLiteralTypes1.ts, 87, 96))
>T27 : Symbol(T27, Decl(templateLiteralTypes1.ts, 90, 33))
>FirstTwoAndRest : Symbol(FirstTwoAndRest, Decl(templateLiteralTypes1.ts, 83, 43))
type HexDigit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' |'8' | '9' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f';
>HexDigit : Symbol(HexDigit, Decl(templateLiteralTypes1.ts, 91, 31))
>HexDigit : Symbol(HexDigit, Decl(templateLiteralTypes1.ts, 91, 32))
type HexColor<S extends string> =
>HexColor : Symbol(HexColor, Decl(templateLiteralTypes1.ts, 93, 145))
@@ -339,12 +340,12 @@ type HexColor<S extends string> =
>G2 : Symbol(G2, Decl(templateLiteralTypes1.ts, 96, 56))
>B1 : Symbol(B1, Decl(templateLiteralTypes1.ts, 96, 67))
>B2 : Symbol(B2, Decl(templateLiteralTypes1.ts, 96, 78))
>HexDigit : Symbol(HexDigit, Decl(templateLiteralTypes1.ts, 91, 31))
>HexDigit : Symbol(HexDigit, Decl(templateLiteralTypes1.ts, 91, 31))
>HexDigit : Symbol(HexDigit, Decl(templateLiteralTypes1.ts, 91, 31))
>HexDigit : Symbol(HexDigit, Decl(templateLiteralTypes1.ts, 91, 31))
>HexDigit : Symbol(HexDigit, Decl(templateLiteralTypes1.ts, 91, 31))
>HexDigit : Symbol(HexDigit, Decl(templateLiteralTypes1.ts, 91, 31))
>HexDigit : Symbol(HexDigit, Decl(templateLiteralTypes1.ts, 91, 32))
>HexDigit : Symbol(HexDigit, Decl(templateLiteralTypes1.ts, 91, 32))
>HexDigit : Symbol(HexDigit, Decl(templateLiteralTypes1.ts, 91, 32))
>HexDigit : Symbol(HexDigit, Decl(templateLiteralTypes1.ts, 91, 32))
>HexDigit : Symbol(HexDigit, Decl(templateLiteralTypes1.ts, 91, 32))
>HexDigit : Symbol(HexDigit, Decl(templateLiteralTypes1.ts, 91, 32))
S :
>S : Symbol(S, Decl(templateLiteralTypes1.ts, 95, 14))
@@ -46,10 +46,21 @@ type TS1 = ToString<'abc' | 42 | true | -1234n>;
>-1234n : -1234n
>1234n : 1234n
// Casing modifiers
// Nested template literal type normalization
type Cases<T extends string> = `${uppercase T} ${lowercase T} ${capitalize T} ${uncapitalize T}`;
>Cases : `${uppercase T} ${lowercase T} ${capitalize T} ${uncapitalize T}`
type TL1<T extends string> = `a${T}b${T}c`;
>TL1 : `a${T}b${T}c`
type TL2<U extends string> = TL1<`x${U}y`>; // `ax${U}ybx{$U}yc`
>TL2 : `ax${U}ybx${U}yc`
type TL3 = TL2<'o'>; // 'axoybxoyc'
>TL3 : "axoybxoyc"
// Casing intrinsics
type Cases<T extends string> = `${Uppercase<T>} ${Lowercase<T>} ${Capitalize<T>} ${Uncapitalize<T>}`;
>Cases : `${Uppercase<T>} ${Lowercase<T>} ${Capitalize<T>} ${Uncapitalize<T>}`
type TCA1 = Cases<'bar'>; // 'BAR bar Bar bar'
>TCA1 : "BAR bar Bar bar"
@@ -59,17 +70,17 @@ type TCA2 = Cases<'BAR'>; // 'BAR bar BAR bAR'
// Assignability
function test<T extends 'foo' | 'bar'>(name: `get${capitalize T}`) {
>test : <T extends "bar" | "foo">(name: `get${capitalize T}`) => void
>name : `get${capitalize T}`
function test<T extends 'foo' | 'bar'>(name: `get${Capitalize<T>}`) {
>test : <T extends "bar" | "foo">(name: `get${Capitalize<T>}`) => void
>name : `get${Capitalize<T>}`
let s1: string = name;
>s1 : string
>name : `get${capitalize T}`
>name : `get${Capitalize<T>}`
let s2: 'getFoo' | 'getBar' = name;
>s2 : "getFoo" | "getBar"
>name : `get${capitalize T}`
>name : `get${Capitalize<T>}`
}
function fa1<T>(x: T, y: { [P in keyof T]: T[P] }, z: { [P in keyof T & string as `p_${P}`]: T[P] }) {
@@ -147,16 +158,16 @@ type T24 = MatchPair<'[1,2,3,4]'>; // ['1', '2,3,4']
type SnakeToCamelCase<S extends string> =
>SnakeToCamelCase : SnakeToCamelCase<S>
S extends `${infer T}_${infer U}` ? `${lowercase T}${SnakeToPascalCase<U>}` :
S extends `${infer T}` ? `${lowercase T}` :
S extends `${infer T}_${infer U}` ? `${Lowercase<T>}${SnakeToPascalCase<U>}` :
S extends `${infer T}` ? `${Lowercase<T>}` :
SnakeToPascalCase<S>;
type SnakeToPascalCase<S extends string> =
>SnakeToPascalCase : SnakeToPascalCase<S>
string extends S ? string :
S extends `${infer T}_${infer U}` ? `${capitalize `${lowercase T}`}${SnakeToPascalCase<U>}` :
S extends `${infer T}` ? `${capitalize `${lowercase T}`}` :
S extends `${infer T}_${infer U}` ? `${Capitalize<Lowercase<T>>}${SnakeToPascalCase<U>}` :
S extends `${infer T}` ? `${Capitalize<Lowercase<T>>}` :
never;
type RR0 = SnakeToPascalCase<'hello_world_foo'>; // 'HelloWorldFoo'
@@ -185,18 +196,6 @@ type T26 = FirstTwoAndRest<'ab'>; // ['ab', '']
type T27 = FirstTwoAndRest<'a'>; // unknown
>T27 : unknown
type Capitalize<S extends string> = S extends `${infer H}${infer T}` ? `${uppercase H}${T}` : S;
>Capitalize : Capitalize<S>
type Uncapitalize<S extends string> = S extends `${infer H}${infer T}` ? `${lowercase H}${T}` : S;
>Uncapitalize : Uncapitalize<S>
type TC1 = Capitalize<'foo'>; // 'Foo'
>TC1 : "Foo"
type TC2 = Uncapitalize<'Foo'>; // 'foo'
>TC2 : "foo"
type HexDigit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' |'8' | '9' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f';
>HexDigit : HexDigit
@@ -18,16 +18,22 @@ type Loc = `${'top' | 'middle' | 'bottom'}-${'left' | 'center' | 'right'}`;
type ToString<T extends string | number | boolean | bigint> = `${T}`;
type TS1 = ToString<'abc' | 42 | true | -1234n>;
// Casing modifiers
// Nested template literal type normalization
type Cases<T extends string> = `${uppercase T} ${lowercase T} ${capitalize T} ${uncapitalize T}`;
type TL1<T extends string> = `a${T}b${T}c`;
type TL2<U extends string> = TL1<`x${U}y`>; // `ax${U}ybx{$U}yc`
type TL3 = TL2<'o'>; // 'axoybxoyc'
// Casing intrinsics
type Cases<T extends string> = `${Uppercase<T>} ${Lowercase<T>} ${Capitalize<T>} ${Uncapitalize<T>}`;
type TCA1 = Cases<'bar'>; // 'BAR bar Bar bar'
type TCA2 = Cases<'BAR'>; // 'BAR bar BAR bAR'
// Assignability
function test<T extends 'foo' | 'bar'>(name: `get${capitalize T}`) {
function test<T extends 'foo' | 'bar'>(name: `get${Capitalize<T>}`) {
let s1: string = name;
let s2: 'getFoo' | 'getBar' = name;
}
@@ -65,14 +71,14 @@ type T23 = MatchPair<'[123]'>; // unknown
type T24 = MatchPair<'[1,2,3,4]'>; // ['1', '2,3,4']
type SnakeToCamelCase<S extends string> =
S extends `${infer T}_${infer U}` ? `${lowercase T}${SnakeToPascalCase<U>}` :
S extends `${infer T}` ? `${lowercase T}` :
S extends `${infer T}_${infer U}` ? `${Lowercase<T>}${SnakeToPascalCase<U>}` :
S extends `${infer T}` ? `${Lowercase<T>}` :
SnakeToPascalCase<S>;
type SnakeToPascalCase<S extends string> =
string extends S ? string :
S extends `${infer T}_${infer U}` ? `${capitalize `${lowercase T}`}${SnakeToPascalCase<U>}` :
S extends `${infer T}` ? `${capitalize `${lowercase T}`}` :
S extends `${infer T}_${infer U}` ? `${Capitalize<Lowercase<T>>}${SnakeToPascalCase<U>}` :
S extends `${infer T}` ? `${Capitalize<Lowercase<T>>}` :
never;
type RR0 = SnakeToPascalCase<'hello_world_foo'>; // 'HelloWorldFoo'
@@ -88,12 +94,6 @@ type T25 = FirstTwoAndRest<'abcde'>; // ['ab', 'cde']
type T26 = FirstTwoAndRest<'ab'>; // ['ab', '']
type T27 = FirstTwoAndRest<'a'>; // unknown
type Capitalize<S extends string> = S extends `${infer H}${infer T}` ? `${uppercase H}${T}` : S;
type Uncapitalize<S extends string> = S extends `${infer H}${infer T}` ? `${lowercase H}${T}` : S;
type TC1 = Capitalize<'foo'>; // 'Foo'
type TC2 = Uncapitalize<'Foo'>; // 'foo'
type HexDigit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' |'8' | '9' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f';
type HexColor<S extends string> =
@@ -3,7 +3,7 @@
// Mapped type 'as N' clauses
type Getters<T> = { [P in keyof T & string as `get${capitalize P}`]: () => T[P] };
type Getters<T> = { [P in keyof T & string as `get${Capitalize<P>}`]: () => T[P] };
type TG1 = Getters<{ foo: string, bar: number, baz: { z: boolean } }>;
// Mapped type with 'as N' clause has no constraint on 'in T' clause
@@ -34,7 +34,7 @@ type TD3<U> = keyof DoubleProp<U>; // `${keyof U & string}1` | `${keyof U & str
// Repro from #40619
type Lazyify<T> = {
[K in keyof T as `get${capitalize string & K}`]: () => T[K]
[K in keyof T as `get${Capitalize<K & string>}`]: () => T[K]
};
interface Person {
@@ -0,0 +1,22 @@
// @strict: true
let e1: intrinsic;
let e2: { intrinsic: intrinsic };
type TE1 = (intrinsic);
type TE2<intrinsic> = intrinsic;
type TE3<T extends intrinsic> = T;
type TE4<intrinsic extends intrinsic> = intrinsic;
type TE5<intrinsic extends intrinsic> = (intrinsic);
function f1() {
let intrinsic: intrinsic.intrinsic;
}
function f2(intrinsic: string) {
return intrinsic;
}
function f3() {
type intrinsic = string;
let s1: intrinsic = 'ok';
}
@@ -0,0 +1,57 @@
// @strict: true
// @declaration: true
type TU1 = Uppercase<'hello'>; // "HELLO"
type TU2 = Uppercase<'foo' | 'bar'>; // "FOO" | "BAR"
type TU3 = Uppercase<string>; // string
type TU4 = Uppercase<any>; // any
type TU5 = Uppercase<never>; // never
type TU6 = Uppercase<42>; // Error
type TL1 = Lowercase<'HELLO'>; // "hello"
type TL2 = Lowercase<'FOO' | 'BAR'>; // "foo" | "bar"
type TL3 = Lowercase<string>; // string
type TL4 = Lowercase<any>; // any
type TL5 = Lowercase<never>; // never
type TL6 = Lowercase<42>; // Error
type TC1 = Capitalize<'hello'>; // "Hello"
type TC2 = Capitalize<'foo' | 'bar'>; // "Foo" | "Bar"
type TC3 = Capitalize<string>; // string
type TC4 = Capitalize<any>; // any
type TC5 = Capitalize<never>; // never
type TC6 = Capitalize<42>; // Error
type TN1 = Uncapitalize<'Hello'>; // "hello"
type TN2 = Uncapitalize<'Foo' | 'Bar'>; // "foo" | "bar"
type TN3 = Uncapitalize<string>; // string
type TN4 = Uncapitalize<any>; // any
type TN5 = Uncapitalize<never>; // never
type TN6 = Uncapitalize<42>; // Error
type TX1<S extends string> = Uppercase<`aB${S}`>;
type TX2 = TX1<'xYz'>; // "ABXYZ"
type TX3<S extends string> = Lowercase<`aB${S}`>;
type TX4 = TX3<'xYz'>; // "abxyz"
type TX5 = `${Uppercase<'abc'>}${Lowercase<'XYZ'>}`; // "ABCxyz"
type MyUppercase<S extends string> = intrinsic; // Error
function foo1<T extends string, U extends T>(s: string, x: Uppercase<T>, y: Uppercase<U>) {
s = x;
s = y;
x = s; // Error
x = y;
y = s; // Error
y = x; // Error
}
function foo2<T extends 'foo' | 'bar'>(x: Uppercase<T>) {
let s: 'FOO' | 'BAR' = x;
}
declare function foo3<T extends string>(x: Uppercase<T>): T;
function foo4<U extends string>(x: Uppercase<U>) {
return foo3(x);
}