MCPcopy Create free account
hub / github.com/microsoft/typescript-go / createTupleTargetType

Method createTupleTargetType

internal/checker/checker.go:24683–24736  ·  view source on GitHub ↗

We represent tuple types as type references to synthesized generic interface types created by this function. The types are of the form: interface Tuple extends Array { 0: T0, 1: T1, 2: T2, ... } Note that the generic type created by this function has no symbol

(elementInfos []TupleElementInfo, readonly bool)

Source from the content-addressed store, hash-verified

24681// Note that the generic type created by this function has no symbol associated with it. The same
24682// is true for each of the synthesized type parameters.
24683func (c *Checker) createTupleTargetType(elementInfos []TupleElementInfo, readonly bool) *Type {
24684 arity := len(elementInfos)
24685 minLength := core.CountWhere(elementInfos, func(e TupleElementInfo) bool {
24686 return e.flags&(ElementFlagsRequired|ElementFlagsVariadic) != 0
24687 })
24688 var typeParameters []*Type
24689 members := make(ast.SymbolTable)
24690 combinedFlags := ElementFlagsNone
24691 if arity != 0 {
24692 typeParameters = make([]*Type, 0, arity)
24693 for i := range arity {
24694 typeParameter := c.newTypeParameter(nil)
24695 typeParameters = append(typeParameters, typeParameter)
24696 flags := elementInfos[i].flags
24697 combinedFlags |= flags
24698 if combinedFlags&ElementFlagsVariable == 0 {
24699 property := c.newSymbolEx(ast.SymbolFlagsProperty|core.IfElse(flags&ElementFlagsOptional != 0, ast.SymbolFlagsOptional, 0), strconv.Itoa(i), core.IfElse(readonly, ast.CheckFlagsReadonly, 0))
24700 c.valueSymbolLinks.Get(property).resolvedType = typeParameter
24701 // c.valueSymbolLinks.get(property).tupleLabelDeclaration = elementInfos[i].labeledDeclaration
24702 members[property.Name] = property
24703 }
24704 }
24705 }
24706 fixedLength := len(members)
24707 lengthSymbol := c.newSymbolEx(ast.SymbolFlagsProperty, "length", core.IfElse(readonly, ast.CheckFlagsReadonly, 0))
24708 if combinedFlags&ElementFlagsVariable != 0 {
24709 c.valueSymbolLinks.Get(lengthSymbol).resolvedType = c.numberType
24710 } else {
24711 var literalTypes []*Type
24712 for i := minLength; i <= arity; i++ {
24713 literalTypes = append(literalTypes, c.getNumberLiteralType(jsnum.Number(i)))
24714 }
24715 c.valueSymbolLinks.Get(lengthSymbol).resolvedType = c.getUnionType(literalTypes)
24716 }
24717 members[lengthSymbol.Name] = lengthSymbol
24718 t := c.newObjectType(ObjectFlagsTuple|ObjectFlagsReference, nil)
24719 d := t.AsTupleType()
24720 d.thisType = c.newTypeParameter(nil)
24721 d.thisType.AsTypeParameter().isThisType = true
24722 d.thisType.AsTypeParameter().constraint = t
24723 d.allTypeParameters = append(typeParameters, d.thisType)
24724 d.instantiations = make(map[CacheHashKey]*Type)
24725 d.instantiations[getTypeListKey(d.TypeParameters())] = t
24726 d.target = t
24727 d.resolvedTypeArguments = d.TypeParameters()
24728 d.declaredMembersResolved = true
24729 d.declaredMembers = members
24730 d.elementInfos = elementInfos
24731 d.minLength = minLength
24732 d.fixedLength = fixedLength
24733 d.combinedFlags = combinedFlags
24734 d.readonly = readonly
24735 return t
24736}
24737
24738func (c *Checker) getElementTypeOfSliceOfTupleType(t *Type, index int, endSkipCount int, writing bool, noReductions bool) *Type {
24739 length := c.getTypeReferenceArity(t) - endSkipCount

Callers 1

getTupleTargetTypeMethod · 0.95

Calls 15

newTypeParameterMethod · 0.95
newSymbolExMethod · 0.95
getNumberLiteralTypeMethod · 0.95
getUnionTypeMethod · 0.95
newObjectTypeMethod · 0.95
CountWhereFunction · 0.92
IfElseFunction · 0.92
NumberTypeAlias · 0.92
lenFunction · 0.85
getTypeListKeyFunction · 0.85
AsTupleTypeMethod · 0.80
AsTypeParameterMethod · 0.80

Tested by

no test coverage detected