Fixed an issue with contextual type for intersection properties (take 2) (#52095)
This commit is contained in:
Родитель
6894ff7f38
Коммит
e6edc567a3
|
@ -31672,33 +31672,106 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
|
|||
return !!(getCheckFlags(symbol) & CheckFlags.Mapped && !(symbol as MappedSymbol).links.type && findResolutionCycleStartIndex(symbol, TypeSystemPropertyName.Type) >= 0);
|
||||
}
|
||||
|
||||
function isExcludedMappedPropertyName(constraint: Type, propertyNameType: Type): boolean {
|
||||
if (constraint.flags & TypeFlags.Conditional) {
|
||||
const type = constraint as ConditionalType;
|
||||
return !!(getReducedType(getTrueTypeFromConditionalType(type)).flags & TypeFlags.Never) &&
|
||||
getActualTypeVariable(getFalseTypeFromConditionalType(type)) === getActualTypeVariable(type.checkType) &&
|
||||
isTypeAssignableTo(propertyNameType, type.extendsType);
|
||||
}
|
||||
if (constraint.flags & TypeFlags.Intersection) {
|
||||
return some((constraint as IntersectionType).types, t => isExcludedMappedPropertyName(t, propertyNameType));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function getTypeOfPropertyOfContextualType(type: Type, name: __String, nameType?: Type) {
|
||||
return mapType(type, t => {
|
||||
if (isGenericMappedType(t) && getMappedTypeNameTypeKind(t) !== MappedTypeNameTypeKind.Remapping) {
|
||||
const constraint = getConstraintTypeFromMappedType(t);
|
||||
const constraintOfConstraint = getBaseConstraintOfType(constraint) || constraint;
|
||||
const propertyNameType = nameType || getStringLiteralType(unescapeLeadingUnderscores(name));
|
||||
if (isTypeAssignableTo(propertyNameType, constraintOfConstraint)) {
|
||||
return substituteIndexedMappedType(t, propertyNameType);
|
||||
if (t.flags & TypeFlags.Intersection) {
|
||||
let types: Type[] | undefined;
|
||||
let indexInfoCandidates: Type[] | undefined;
|
||||
let ignoreIndexInfos = false;
|
||||
for (const constituentType of (t as IntersectionType).types) {
|
||||
if (!(constituentType.flags & TypeFlags.Object)) {
|
||||
continue;
|
||||
}
|
||||
if (isGenericMappedType(constituentType) && getMappedTypeNameTypeKind(constituentType) !== MappedTypeNameTypeKind.Remapping) {
|
||||
const substitutedType = getIndexedMappedTypeSubstitutedTypeOfContextualType(constituentType, name, nameType);
|
||||
types = appendContextualPropertyTypeConstituent(types, substitutedType);
|
||||
continue;
|
||||
}
|
||||
const propertyType = getTypeOfConcretePropertyOfContextualType(constituentType, name);
|
||||
if (!propertyType) {
|
||||
if (!ignoreIndexInfos) {
|
||||
indexInfoCandidates = append(indexInfoCandidates, constituentType);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
ignoreIndexInfos = true;
|
||||
indexInfoCandidates = undefined;
|
||||
types = appendContextualPropertyTypeConstituent(types, propertyType);
|
||||
}
|
||||
}
|
||||
else if (t.flags & TypeFlags.StructuredType) {
|
||||
const prop = getPropertyOfType(t, name);
|
||||
if (prop) {
|
||||
return isCircularMappedProperty(prop) ? undefined : removeMissingType(getTypeOfSymbol(prop), !!(prop.flags & SymbolFlags.Optional));
|
||||
}
|
||||
if (isTupleType(t) && isNumericLiteralName(name) && +name >= 0) {
|
||||
const restType = getElementTypeOfSliceOfTupleType(t, t.target.fixedLength, /*endSkipCount*/ 0, /*writing*/ false, /*noReductions*/ true);
|
||||
if (restType) {
|
||||
return restType;
|
||||
if (indexInfoCandidates) {
|
||||
for (const candidate of indexInfoCandidates) {
|
||||
const indexInfoType = getTypeFromIndexInfosOfContextualType(candidate, name, nameType);
|
||||
types = appendContextualPropertyTypeConstituent(types, indexInfoType);
|
||||
}
|
||||
}
|
||||
return findApplicableIndexInfo(getIndexInfosOfStructuredType(t), nameType || getStringLiteralType(unescapeLeadingUnderscores(name)))?.type;
|
||||
if (!types) {
|
||||
return;
|
||||
}
|
||||
if (types.length === 1) {
|
||||
return types[0];
|
||||
}
|
||||
return getIntersectionType(types);
|
||||
}
|
||||
return undefined;
|
||||
if (!(t.flags & TypeFlags.Object)) {
|
||||
return;
|
||||
}
|
||||
return isGenericMappedType(t) && getMappedTypeNameTypeKind(t) !== MappedTypeNameTypeKind.Remapping
|
||||
? getIndexedMappedTypeSubstitutedTypeOfContextualType(t, name, nameType)
|
||||
: getTypeOfConcretePropertyOfContextualType(t, name) ?? getTypeFromIndexInfosOfContextualType(t, name, nameType);
|
||||
}, /*noReductions*/ true);
|
||||
}
|
||||
|
||||
function appendContextualPropertyTypeConstituent(types: Type[] | undefined, type: Type | undefined) {
|
||||
// any doesn't provide any contextual information but could spoil the overall result by nullifying contextual information provided by other intersection constituents
|
||||
// so it gets replaced with `unknown` as `T & unknown` is just `T` and all types computed based on the contextual information provided by other constituens are still assignable to any
|
||||
return type ? append(types, type.flags & TypeFlags.Any ? unknownType : type) : types;
|
||||
}
|
||||
|
||||
function getIndexedMappedTypeSubstitutedTypeOfContextualType(type: MappedType, name: __String, nameType: Type | undefined) {
|
||||
const propertyNameType = nameType || getStringLiteralType(unescapeLeadingUnderscores(name));
|
||||
const constraint = getConstraintTypeFromMappedType(type);
|
||||
// special case for conditional types pretending to be negated types
|
||||
if (type.nameType && isExcludedMappedPropertyName(type.nameType, propertyNameType) || isExcludedMappedPropertyName(constraint, propertyNameType)) {
|
||||
return;
|
||||
}
|
||||
const constraintOfConstraint = getBaseConstraintOfType(constraint) || constraint;
|
||||
if (!isTypeAssignableTo(propertyNameType, constraintOfConstraint)) {
|
||||
return;
|
||||
}
|
||||
return substituteIndexedMappedType(type, propertyNameType);
|
||||
}
|
||||
|
||||
function getTypeOfConcretePropertyOfContextualType(type: Type, name: __String) {
|
||||
const prop = getPropertyOfType(type, name);
|
||||
if (!prop || isCircularMappedProperty(prop)) {
|
||||
return;
|
||||
}
|
||||
return removeMissingType(getTypeOfSymbol(prop), !!(prop.flags & SymbolFlags.Optional));
|
||||
}
|
||||
|
||||
function getTypeFromIndexInfosOfContextualType(type: Type, name: __String, nameType: Type | undefined) {
|
||||
if (isTupleType(type) && isNumericLiteralName(name) && +name >= 0) {
|
||||
const restType = getElementTypeOfSliceOfTupleType(type, type.target.fixedLength, /*endSkipCount*/ 0, /*writing*/ false, /*noReductions*/ true);
|
||||
if (restType) {
|
||||
return restType;
|
||||
}
|
||||
}
|
||||
return findApplicableIndexInfo(getIndexInfosOfStructuredType(type), nameType || getStringLiteralType(unescapeLeadingUnderscores(name)))?.type;
|
||||
}
|
||||
|
||||
// In an object literal contextually typed by a type T, the contextual type of a property assignment is the type of
|
||||
// the matching property in T, if one exists. Otherwise, it is the type of the numeric index signature in T, if one
|
||||
// exists. Otherwise, it is the type of the string index signature in T, if one exists.
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
contextualPropertyOfGenericFilteringMappedType.ts(38,5): error TS2353: Object literal may only specify known properties, and 'foo' does not exist in type '{ bar: (value: string, prop: "bar") => void; }'.
|
||||
contextualPropertyOfGenericFilteringMappedType.ts(38,11): error TS7006: Parameter 'value' implicitly has an 'any' type.
|
||||
contextualPropertyOfGenericFilteringMappedType.ts(38,18): error TS7006: Parameter 'key' implicitly has an 'any' type.
|
||||
|
||||
|
||||
==== contextualPropertyOfGenericFilteringMappedType.ts (3 errors) ====
|
||||
declare function f1<T extends object>(
|
||||
data: T,
|
||||
handlers: { [P in keyof T as P]: (value: T[P], prop: P) => void },
|
||||
): void;
|
||||
|
||||
f1(
|
||||
{
|
||||
foo: 0,
|
||||
bar: "",
|
||||
},
|
||||
{
|
||||
foo: (value, key) => {},
|
||||
bar: (value, key) => {},
|
||||
},
|
||||
);
|
||||
|
||||
declare function f2<T extends object>(
|
||||
data: T,
|
||||
handlers: { [P in keyof T as T[P] extends string ? P : never]: (value: T[P], prop: P) => void },
|
||||
): void;
|
||||
|
||||
f2(
|
||||
{
|
||||
foo: 0,
|
||||
bar: "",
|
||||
},
|
||||
{
|
||||
bar: (value, key) => {},
|
||||
},
|
||||
);
|
||||
|
||||
f2(
|
||||
{
|
||||
foo: 0,
|
||||
bar: "",
|
||||
},
|
||||
{
|
||||
foo: (value, key) => {
|
||||
~~~
|
||||
!!! error TS2353: Object literal may only specify known properties, and 'foo' does not exist in type '{ bar: (value: string, prop: "bar") => void; }'.
|
||||
~~~~~
|
||||
!!! error TS7006: Parameter 'value' implicitly has an 'any' type.
|
||||
~~~
|
||||
!!! error TS7006: Parameter 'key' implicitly has an 'any' type.
|
||||
// implicit `any`s
|
||||
},
|
||||
},
|
||||
);
|
||||
|
|
@ -88,3 +88,24 @@ f2(
|
|||
},
|
||||
);
|
||||
|
||||
f2(
|
||||
>f2 : Symbol(f2, Decl(contextualPropertyOfGenericFilteringMappedType.ts, 14, 2))
|
||||
{
|
||||
foo: 0,
|
||||
>foo : Symbol(foo, Decl(contextualPropertyOfGenericFilteringMappedType.ts, 32, 3))
|
||||
|
||||
bar: "",
|
||||
>bar : Symbol(bar, Decl(contextualPropertyOfGenericFilteringMappedType.ts, 33, 11))
|
||||
|
||||
},
|
||||
{
|
||||
foo: (value, key) => {
|
||||
>foo : Symbol(foo, Decl(contextualPropertyOfGenericFilteringMappedType.ts, 36, 3))
|
||||
>value : Symbol(value, Decl(contextualPropertyOfGenericFilteringMappedType.ts, 37, 10))
|
||||
>key : Symbol(key, Decl(contextualPropertyOfGenericFilteringMappedType.ts, 37, 16))
|
||||
|
||||
// implicit `any`s
|
||||
},
|
||||
},
|
||||
);
|
||||
|
||||
|
|
|
@ -125,3 +125,44 @@ f2(
|
|||
},
|
||||
);
|
||||
|
||||
f2(
|
||||
>f2( { foo: 0, bar: "", }, { foo: (value, key) => { // implicit `any`s }, },) : void
|
||||
> : ^^^^
|
||||
>f2 : <T extends object>(data: T, handlers: { [P in keyof T as T[P] extends string ? P : never]: (value: T[P], prop: P) => void; }) => void
|
||||
> : ^ ^^^^^^^^^ ^^ ^^ ^^ ^^ ^^^^^
|
||||
{
|
||||
>{ foo: 0, bar: "", } : { foo: number; bar: string; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
foo: 0,
|
||||
>foo : number
|
||||
> : ^^^^^^
|
||||
>0 : 0
|
||||
> : ^
|
||||
|
||||
bar: "",
|
||||
>bar : string
|
||||
> : ^^^^^^
|
||||
>"" : ""
|
||||
> : ^^
|
||||
|
||||
},
|
||||
{
|
||||
>{ foo: (value, key) => { // implicit `any`s }, } : { foo: (value: any, key: any) => void; }
|
||||
> : ^^^^^^^^ ^^^^^^^ ^^^^^^^^^^^^^^^^^
|
||||
|
||||
foo: (value, key) => {
|
||||
>foo : (value: any, key: any) => void
|
||||
> : ^ ^^^^^^^ ^^^^^^^^^^^^^^
|
||||
>(value, key) => { // implicit `any`s } : (value: any, key: any) => void
|
||||
> : ^ ^^^^^^^ ^^^^^^^^^^^^^^
|
||||
>value : any
|
||||
> : ^^^
|
||||
>key : any
|
||||
> : ^^^
|
||||
|
||||
// implicit `any`s
|
||||
},
|
||||
},
|
||||
);
|
||||
|
||||
|
|
|
@ -0,0 +1,114 @@
|
|||
//// [tests/cases/compiler/contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts] ////
|
||||
|
||||
=== contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts ===
|
||||
type ComponentType<P> = (p: P) => any;
|
||||
>ComponentType : Symbol(ComponentType, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 0, 0))
|
||||
>P : Symbol(P, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 0, 19))
|
||||
>p : Symbol(p, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 0, 25))
|
||||
>P : Symbol(P, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 0, 19))
|
||||
|
||||
type ComponentProps<C> = C extends ComponentType<infer P> ? P : never;
|
||||
>ComponentProps : Symbol(ComponentProps, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 0, 38))
|
||||
>C : Symbol(C, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 1, 20))
|
||||
>C : Symbol(C, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 1, 20))
|
||||
>ComponentType : Symbol(ComponentType, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 0, 0))
|
||||
>P : Symbol(P, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 1, 54))
|
||||
>P : Symbol(P, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 1, 54))
|
||||
|
||||
type Attrs<P, A extends Partial<P>> = A;
|
||||
>Attrs : Symbol(Attrs, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 1, 70))
|
||||
>P : Symbol(P, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 3, 11))
|
||||
>A : Symbol(A, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 3, 13))
|
||||
>Partial : Symbol(Partial, Decl(lib.es5.d.ts, --, --))
|
||||
>P : Symbol(P, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 3, 11))
|
||||
>A : Symbol(A, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 3, 13))
|
||||
|
||||
interface StyledFunction<
|
||||
>StyledFunction : Symbol(StyledFunction, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 3, 40))
|
||||
|
||||
C extends ComponentType<any>,
|
||||
>C : Symbol(C, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 5, 25))
|
||||
>ComponentType : Symbol(ComponentType, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 0, 0))
|
||||
|
||||
O extends object = {},
|
||||
>O : Symbol(O, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 6, 31))
|
||||
|
||||
A extends keyof any = never,
|
||||
>A : Symbol(A, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 7, 24))
|
||||
|
||||
> {
|
||||
attrs<
|
||||
>attrs : Symbol(StyledFunction.attrs, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 9, 3))
|
||||
|
||||
U,
|
||||
>U : Symbol(U, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 10, 8))
|
||||
|
||||
NewA extends Partial<ComponentProps<C> & U> & {
|
||||
>NewA : Symbol(NewA, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 11, 6))
|
||||
>Partial : Symbol(Partial, Decl(lib.es5.d.ts, --, --))
|
||||
>ComponentProps : Symbol(ComponentProps, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 0, 38))
|
||||
>C : Symbol(C, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 5, 25))
|
||||
>U : Symbol(U, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 10, 8))
|
||||
|
||||
[others: string]: any;
|
||||
>others : Symbol(others, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 13, 7))
|
||||
|
||||
} = {},
|
||||
>(
|
||||
attrs: Attrs<ComponentProps<C> & U, NewA>,
|
||||
>attrs : Symbol(attrs, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 15, 4))
|
||||
>Attrs : Symbol(Attrs, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 1, 70))
|
||||
>ComponentProps : Symbol(ComponentProps, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 0, 38))
|
||||
>C : Symbol(C, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 5, 25))
|
||||
>U : Symbol(U, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 10, 8))
|
||||
>NewA : Symbol(NewA, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 11, 6))
|
||||
|
||||
): StyledFunction<C, O & NewA, A | keyof NewA>;
|
||||
>StyledFunction : Symbol(StyledFunction, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 3, 40))
|
||||
>C : Symbol(C, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 5, 25))
|
||||
>O : Symbol(O, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 6, 31))
|
||||
>NewA : Symbol(NewA, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 11, 6))
|
||||
>A : Symbol(A, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 7, 24))
|
||||
>NewA : Symbol(NewA, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 11, 6))
|
||||
}
|
||||
|
||||
interface StyledInterface {
|
||||
>StyledInterface : Symbol(StyledInterface, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 18, 1))
|
||||
|
||||
<C extends ComponentType<any>>(component: C): StyledFunction<C>;
|
||||
>C : Symbol(C, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 21, 3))
|
||||
>ComponentType : Symbol(ComponentType, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 0, 0))
|
||||
>component : Symbol(component, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 21, 33))
|
||||
>C : Symbol(C, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 21, 3))
|
||||
>StyledFunction : Symbol(StyledFunction, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 3, 40))
|
||||
>C : Symbol(C, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 21, 3))
|
||||
}
|
||||
|
||||
declare const styled: StyledInterface;
|
||||
>styled : Symbol(styled, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 24, 13))
|
||||
>StyledInterface : Symbol(StyledInterface, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 18, 1))
|
||||
|
||||
interface BaseProps {
|
||||
>BaseProps : Symbol(BaseProps, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 24, 38))
|
||||
|
||||
as?: "select" | "input";
|
||||
>as : Symbol(BaseProps.as, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 26, 21))
|
||||
}
|
||||
|
||||
declare const Flex: (props: BaseProps) => null;
|
||||
>Flex : Symbol(Flex, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 30, 13))
|
||||
>props : Symbol(props, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 30, 21))
|
||||
>BaseProps : Symbol(BaseProps, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 24, 38))
|
||||
|
||||
export const StyledSelect = styled(Flex).attrs({
|
||||
>StyledSelect : Symbol(StyledSelect, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 32, 12))
|
||||
>styled(Flex).attrs : Symbol(StyledFunction.attrs, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 9, 3))
|
||||
>styled : Symbol(styled, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 24, 13))
|
||||
>Flex : Symbol(Flex, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 30, 13))
|
||||
>attrs : Symbol(StyledFunction.attrs, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 9, 3))
|
||||
|
||||
as: "select",
|
||||
>as : Symbol(as, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts, 32, 48))
|
||||
|
||||
});
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
//// [tests/cases/compiler/contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts] ////
|
||||
|
||||
=== contextualTypeBasedOnIntersectionWithAnyInTheMix1.ts ===
|
||||
type ComponentType<P> = (p: P) => any;
|
||||
>ComponentType : ComponentType<P>
|
||||
> : ^^^^^^^^^^^^^^^^
|
||||
>p : P
|
||||
> : ^
|
||||
|
||||
type ComponentProps<C> = C extends ComponentType<infer P> ? P : never;
|
||||
>ComponentProps : ComponentProps<C>
|
||||
> : ^^^^^^^^^^^^^^^^^
|
||||
|
||||
type Attrs<P, A extends Partial<P>> = A;
|
||||
>Attrs : A
|
||||
> : ^
|
||||
|
||||
interface StyledFunction<
|
||||
C extends ComponentType<any>,
|
||||
O extends object = {},
|
||||
A extends keyof any = never,
|
||||
> {
|
||||
attrs<
|
||||
>attrs : <U, NewA extends Partial<ComponentProps<C> & U> & { [others: string]: any; } = {}>(attrs: Attrs<ComponentProps<C> & U, NewA>) => StyledFunction<C, O & NewA, A | keyof NewA>
|
||||
> : ^ ^^ ^^^^^^^^^ ^^^^^^^ ^^ ^^^^^
|
||||
|
||||
U,
|
||||
NewA extends Partial<ComponentProps<C> & U> & {
|
||||
[others: string]: any;
|
||||
>others : string
|
||||
> : ^^^^^^
|
||||
|
||||
} = {},
|
||||
>(
|
||||
attrs: Attrs<ComponentProps<C> & U, NewA>,
|
||||
>attrs : NewA
|
||||
> : ^^^^
|
||||
|
||||
): StyledFunction<C, O & NewA, A | keyof NewA>;
|
||||
}
|
||||
|
||||
interface StyledInterface {
|
||||
<C extends ComponentType<any>>(component: C): StyledFunction<C>;
|
||||
>component : C
|
||||
> : ^
|
||||
}
|
||||
|
||||
declare const styled: StyledInterface;
|
||||
>styled : StyledInterface
|
||||
> : ^^^^^^^^^^^^^^^
|
||||
|
||||
interface BaseProps {
|
||||
as?: "select" | "input";
|
||||
>as : "select" | "input" | undefined
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
}
|
||||
|
||||
declare const Flex: (props: BaseProps) => null;
|
||||
>Flex : (props: BaseProps) => null
|
||||
> : ^ ^^ ^^^^^
|
||||
>props : BaseProps
|
||||
> : ^^^^^^^^^
|
||||
|
||||
export const StyledSelect = styled(Flex).attrs({
|
||||
>StyledSelect : StyledFunction<(props: BaseProps) => null, { as: "select"; }, "as">
|
||||
> : ^^^^^^^^^^^^^^^^ ^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>styled(Flex).attrs({ as: "select",}) : StyledFunction<(props: BaseProps) => null, { as: "select"; }, "as">
|
||||
> : ^^^^^^^^^^^^^^^^ ^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>styled(Flex).attrs : <U, NewA extends Partial<BaseProps & U> & { [others: string]: any; } = {}>(attrs: NewA) => StyledFunction<(props: BaseProps) => null, {} & NewA, keyof NewA>
|
||||
> : ^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>styled(Flex) : StyledFunction<(props: BaseProps) => null, {}, never>
|
||||
> : ^^^^^^^^^^^^^^^^ ^^ ^^^^^ ^^^^^^^^^^^^
|
||||
>styled : StyledInterface
|
||||
> : ^^^^^^^^^^^^^^^
|
||||
>Flex : (props: BaseProps) => null
|
||||
> : ^ ^^ ^^^^^
|
||||
>attrs : <U, NewA extends Partial<BaseProps & U> & { [others: string]: any; } = {}>(attrs: NewA) => StyledFunction<(props: BaseProps) => null, {} & NewA, keyof NewA>
|
||||
> : ^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>{ as: "select",} : { as: "select"; }
|
||||
> : ^^^^^^^^^^^^^^^^^
|
||||
|
||||
as: "select",
|
||||
>as : "select"
|
||||
> : ^^^^^^^^
|
||||
>"select" : "select"
|
||||
> : ^^^^^^^^
|
||||
|
||||
});
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
//// [tests/cases/compiler/contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts] ////
|
||||
|
||||
=== contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts ===
|
||||
type IntrinsicElements = {
|
||||
>IntrinsicElements : Symbol(IntrinsicElements, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 0, 0))
|
||||
|
||||
a: {
|
||||
>a : Symbol(a, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 0, 26))
|
||||
|
||||
href?: string;
|
||||
>href : Symbol(href, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 1, 6))
|
||||
|
||||
};
|
||||
div: {
|
||||
>div : Symbol(div, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 3, 4))
|
||||
|
||||
dir?: string;
|
||||
>dir : Symbol(dir, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 4, 8))
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
type Component<Props> = (props: Props) => unknown;
|
||||
>Component : Symbol(Component, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 7, 2))
|
||||
>Props : Symbol(Props, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 9, 15))
|
||||
>props : Symbol(props, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 9, 25))
|
||||
>Props : Symbol(Props, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 9, 15))
|
||||
|
||||
interface NestedMDXComponents {
|
||||
>NestedMDXComponents : Symbol(NestedMDXComponents, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 9, 50))
|
||||
|
||||
[key: string]: Component<any>;
|
||||
>key : Symbol(key, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 12, 3))
|
||||
>Component : Symbol(Component, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 7, 2))
|
||||
}
|
||||
|
||||
type MDXComponents = NestedMDXComponents & {
|
||||
>MDXComponents : Symbol(MDXComponents, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 13, 1))
|
||||
>NestedMDXComponents : Symbol(NestedMDXComponents, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 9, 50))
|
||||
|
||||
[Key in keyof IntrinsicElements]?: Component<IntrinsicElements[Key]>;
|
||||
>Key : Symbol(Key, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 16, 3))
|
||||
>IntrinsicElements : Symbol(IntrinsicElements, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 0, 0))
|
||||
>Component : Symbol(Component, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 7, 2))
|
||||
>IntrinsicElements : Symbol(IntrinsicElements, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 0, 0))
|
||||
>Key : Symbol(Key, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 16, 3))
|
||||
|
||||
};
|
||||
|
||||
export interface MDXProps {
|
||||
>MDXProps : Symbol(MDXProps, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 17, 2))
|
||||
|
||||
components?: MDXComponents;
|
||||
>components : Symbol(MDXProps.components, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 19, 27))
|
||||
>MDXComponents : Symbol(MDXComponents, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 13, 1))
|
||||
}
|
||||
|
||||
declare function MyMDXComponent(props: MDXProps): null;
|
||||
>MyMDXComponent : Symbol(MyMDXComponent, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 21, 1))
|
||||
>props : Symbol(props, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 23, 32))
|
||||
>MDXProps : Symbol(MDXProps, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 17, 2))
|
||||
|
||||
MyMDXComponent({
|
||||
>MyMDXComponent : Symbol(MyMDXComponent, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 21, 1))
|
||||
|
||||
components: {
|
||||
>components : Symbol(components, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 25, 16))
|
||||
|
||||
a(props) {
|
||||
>a : Symbol(a, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 26, 15))
|
||||
>props : Symbol(props, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 27, 6))
|
||||
|
||||
return null;
|
||||
},
|
||||
div(props) {
|
||||
>div : Symbol(div, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 29, 6))
|
||||
>props : Symbol(props, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts, 30, 8))
|
||||
|
||||
return null;
|
||||
},
|
||||
},
|
||||
});
|
||||
|
|
@ -0,0 +1,91 @@
|
|||
//// [tests/cases/compiler/contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts] ////
|
||||
|
||||
=== contextualTypeBasedOnIntersectionWithAnyInTheMix2.ts ===
|
||||
type IntrinsicElements = {
|
||||
>IntrinsicElements : IntrinsicElements
|
||||
> : ^^^^^^^^^^^^^^^^^
|
||||
|
||||
a: {
|
||||
>a : { href?: string; }
|
||||
> : ^^^^^^^^^ ^^^
|
||||
|
||||
href?: string;
|
||||
>href : string | undefined
|
||||
> : ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
};
|
||||
div: {
|
||||
>div : { dir?: string; }
|
||||
> : ^^^^^^^^ ^^^
|
||||
|
||||
dir?: string;
|
||||
>dir : string | undefined
|
||||
> : ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
type Component<Props> = (props: Props) => unknown;
|
||||
>Component : Component<Props>
|
||||
> : ^^^^^^^^^^^^^^^^
|
||||
>props : Props
|
||||
> : ^^^^^
|
||||
|
||||
interface NestedMDXComponents {
|
||||
[key: string]: Component<any>;
|
||||
>key : string
|
||||
> : ^^^^^^
|
||||
}
|
||||
|
||||
type MDXComponents = NestedMDXComponents & {
|
||||
>MDXComponents : MDXComponents
|
||||
> : ^^^^^^^^^^^^^
|
||||
|
||||
[Key in keyof IntrinsicElements]?: Component<IntrinsicElements[Key]>;
|
||||
};
|
||||
|
||||
export interface MDXProps {
|
||||
components?: MDXComponents;
|
||||
>components : MDXComponents | undefined
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
}
|
||||
|
||||
declare function MyMDXComponent(props: MDXProps): null;
|
||||
>MyMDXComponent : (props: MDXProps) => null
|
||||
> : ^ ^^ ^^^^^
|
||||
>props : MDXProps
|
||||
> : ^^^^^^^^
|
||||
|
||||
MyMDXComponent({
|
||||
>MyMDXComponent({ components: { a(props) { return null; }, div(props) { return null; }, },}) : null
|
||||
> : ^^^^
|
||||
>MyMDXComponent : (props: MDXProps) => null
|
||||
> : ^ ^^ ^^^^^
|
||||
>{ components: { a(props) { return null; }, div(props) { return null; }, },} : { components: { a(props: { href?: string; }): null; div(props: { dir?: string; }): null; }; }
|
||||
> : ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^^^
|
||||
|
||||
components: {
|
||||
>components : { a(props: { href?: string; }): null; div(props: { dir?: string; }): null; }
|
||||
> : ^^^^ ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^
|
||||
>{ a(props) { return null; }, div(props) { return null; }, } : { a(props: { href?: string; }): null; div(props: { dir?: string; }): null; }
|
||||
> : ^^^^ ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^
|
||||
|
||||
a(props) {
|
||||
>a : (props: { href?: string; }) => null
|
||||
> : ^ ^^^^^^^^^^^ ^^^^^^^^^^^^
|
||||
>props : { href?: string; }
|
||||
> : ^^^^^^^^^ ^^^
|
||||
|
||||
return null;
|
||||
},
|
||||
div(props) {
|
||||
>div : (props: { dir?: string; }) => null
|
||||
> : ^ ^^^^^^^^^^ ^^^^^^^^^^^^
|
||||
>props : { dir?: string; }
|
||||
> : ^^^^^^^^ ^^^
|
||||
|
||||
return null;
|
||||
},
|
||||
},
|
||||
});
|
||||
|
|
@ -0,0 +1,85 @@
|
|||
//// [tests/cases/compiler/contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts] ////
|
||||
|
||||
=== contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts ===
|
||||
type TypeMap = {
|
||||
>TypeMap : Symbol(TypeMap, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 0, 0))
|
||||
|
||||
str: "a" | "b" | "c";
|
||||
>str : Symbol(str, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 0, 16))
|
||||
|
||||
num: 1 | 2 | 3;
|
||||
>num : Symbol(num, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 1, 23))
|
||||
|
||||
};
|
||||
|
||||
declare function test1<
|
||||
>test1 : Symbol(test1, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 3, 2))
|
||||
|
||||
T extends { [K in keyof TypeMap]: TypeMap[K][] } & { [k: string]: any[] },
|
||||
>T : Symbol(T, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 5, 23))
|
||||
>K : Symbol(K, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 6, 15))
|
||||
>TypeMap : Symbol(TypeMap, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 0, 0))
|
||||
>TypeMap : Symbol(TypeMap, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 0, 0))
|
||||
>K : Symbol(K, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 6, 15))
|
||||
>k : Symbol(k, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 6, 56))
|
||||
|
||||
>(arg: T): T;
|
||||
>arg : Symbol(arg, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 7, 2))
|
||||
>T : Symbol(T, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 5, 23))
|
||||
>T : Symbol(T, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 5, 23))
|
||||
|
||||
const result = test1({
|
||||
>result : Symbol(result, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 9, 5))
|
||||
>test1 : Symbol(test1, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 3, 2))
|
||||
|
||||
num: [1, 2],
|
||||
>num : Symbol(num, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 9, 22))
|
||||
|
||||
str: ["a", "b"],
|
||||
>str : Symbol(str, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 10, 14))
|
||||
|
||||
bool: [true, false],
|
||||
>bool : Symbol(bool, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 11, 18))
|
||||
|
||||
});
|
||||
|
||||
declare function test2(a: { type: "foo" | "bar" } & { type: any }): void;
|
||||
>test2 : Symbol(test2, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 13, 3))
|
||||
>a : Symbol(a, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 15, 23))
|
||||
>type : Symbol(type, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 15, 27))
|
||||
>type : Symbol(type, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 15, 53))
|
||||
|
||||
test2({ type: "foo" });
|
||||
>test2 : Symbol(test2, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 13, 3))
|
||||
>type : Symbol(type, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 17, 7))
|
||||
|
||||
// https://github.com/microsoft/TypeScript/issues/59473
|
||||
|
||||
const x: { ml: any } & { ml: 'edge' } = { ml: 'edge' };
|
||||
>x : Symbol(x, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 21, 5))
|
||||
>ml : Symbol(ml, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 21, 10))
|
||||
>ml : Symbol(ml, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 21, 24))
|
||||
>ml : Symbol(ml, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 21, 41))
|
||||
|
||||
const a: [any] & [1] = [1];
|
||||
>a : Symbol(a, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 22, 5))
|
||||
|
||||
const b: any[] & 1[] = [1, 1];
|
||||
>b : Symbol(b, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 23, 5))
|
||||
|
||||
const c: { a: any } & { a: 1 } = { a: 1 };
|
||||
>c : Symbol(c, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 24, 5))
|
||||
>a : Symbol(a, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 24, 10))
|
||||
>a : Symbol(a, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 24, 23))
|
||||
>a : Symbol(a, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 24, 34))
|
||||
|
||||
const d: (() => { a: 1 }) & (() => { a: any }) = () => ({
|
||||
>d : Symbol(d, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 25, 5))
|
||||
>a : Symbol(a, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 25, 17))
|
||||
>a : Symbol(a, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 25, 36))
|
||||
|
||||
a: 1,
|
||||
>a : Symbol(a, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts, 25, 57))
|
||||
|
||||
});
|
||||
|
|
@ -0,0 +1,159 @@
|
|||
//// [tests/cases/compiler/contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts] ////
|
||||
|
||||
=== contextualTypeBasedOnIntersectionWithAnyInTheMix3.ts ===
|
||||
type TypeMap = {
|
||||
>TypeMap : TypeMap
|
||||
> : ^^^^^^^
|
||||
|
||||
str: "a" | "b" | "c";
|
||||
>str : "a" | "b" | "c"
|
||||
> : ^^^^^^^^^^^^^^^
|
||||
|
||||
num: 1 | 2 | 3;
|
||||
>num : 1 | 2 | 3
|
||||
> : ^^^^^^^^^
|
||||
|
||||
};
|
||||
|
||||
declare function test1<
|
||||
>test1 : <T extends { [K in keyof TypeMap]: TypeMap[K][]; } & { [k: string]: any[]; }>(arg: T) => T
|
||||
> : ^ ^^^^^^^^^ ^^ ^^ ^^^^^
|
||||
|
||||
T extends { [K in keyof TypeMap]: TypeMap[K][] } & { [k: string]: any[] },
|
||||
>k : string
|
||||
> : ^^^^^^
|
||||
|
||||
>(arg: T): T;
|
||||
>arg : T
|
||||
> : ^
|
||||
|
||||
const result = test1({
|
||||
>result : { num: (1 | 2)[]; str: ("a" | "b")[]; bool: boolean[]; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>test1({ num: [1, 2], str: ["a", "b"], bool: [true, false],}) : { num: (1 | 2)[]; str: ("a" | "b")[]; bool: boolean[]; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>test1 : <T extends { [K in keyof TypeMap]: TypeMap[K][]; } & { [k: string]: any[]; }>(arg: T) => T
|
||||
> : ^ ^^^^^^^^^ ^^ ^^ ^^^^^
|
||||
>{ num: [1, 2], str: ["a", "b"], bool: [true, false],} : { num: (1 | 2)[]; str: ("a" | "b")[]; bool: boolean[]; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
num: [1, 2],
|
||||
>num : (1 | 2)[]
|
||||
> : ^^^^^^^^^
|
||||
>[1, 2] : (1 | 2)[]
|
||||
> : ^^^^^^^^^
|
||||
>1 : 1
|
||||
> : ^
|
||||
>2 : 2
|
||||
> : ^
|
||||
|
||||
str: ["a", "b"],
|
||||
>str : ("a" | "b")[]
|
||||
> : ^^^^^^^^^^^^^
|
||||
>["a", "b"] : ("a" | "b")[]
|
||||
> : ^^^^^^^^^^^^^
|
||||
>"a" : "a"
|
||||
> : ^^^
|
||||
>"b" : "b"
|
||||
> : ^^^
|
||||
|
||||
bool: [true, false],
|
||||
>bool : boolean[]
|
||||
> : ^^^^^^^^^
|
||||
>[true, false] : boolean[]
|
||||
> : ^^^^^^^^^
|
||||
>true : true
|
||||
> : ^^^^
|
||||
>false : false
|
||||
> : ^^^^^
|
||||
|
||||
});
|
||||
|
||||
declare function test2(a: { type: "foo" | "bar" } & { type: any }): void;
|
||||
>test2 : (a: { type: "foo" | "bar"; } & { type: any; }) => void
|
||||
> : ^ ^^ ^^^^^
|
||||
>a : { type: "foo" | "bar"; } & { type: any; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
|
||||
>type : "foo" | "bar"
|
||||
> : ^^^^^^^^^^^^^
|
||||
>type : any
|
||||
|
||||
test2({ type: "foo" });
|
||||
>test2({ type: "foo" }) : void
|
||||
> : ^^^^
|
||||
>test2 : (a: { type: "foo" | "bar"; } & { type: any; }) => void
|
||||
> : ^ ^^ ^^^^^
|
||||
>{ type: "foo" } : { type: "foo"; }
|
||||
> : ^^^^^^^^^^^^^^^^
|
||||
>type : "foo"
|
||||
> : ^^^^^
|
||||
>"foo" : "foo"
|
||||
> : ^^^^^
|
||||
|
||||
// https://github.com/microsoft/TypeScript/issues/59473
|
||||
|
||||
const x: { ml: any } & { ml: 'edge' } = { ml: 'edge' };
|
||||
>x : { ml: any; } & { ml: "edge"; }
|
||||
> : ^^^^^^ ^^^^^^^^^^^^ ^^^
|
||||
>ml : any
|
||||
>ml : "edge"
|
||||
> : ^^^^^^
|
||||
>{ ml: 'edge' } : { ml: "edge"; }
|
||||
> : ^^^^^^^^^^^^^^^
|
||||
>ml : "edge"
|
||||
> : ^^^^^^
|
||||
>'edge' : "edge"
|
||||
> : ^^^^^^
|
||||
|
||||
const a: [any] & [1] = [1];
|
||||
>a : [any] & [1]
|
||||
> : ^^^^^^^^^^^
|
||||
>[1] : [1]
|
||||
> : ^^^
|
||||
>1 : 1
|
||||
> : ^
|
||||
|
||||
const b: any[] & 1[] = [1, 1];
|
||||
>b : any[] & 1[]
|
||||
> : ^^^^^^^^^^^
|
||||
>[1, 1] : 1[]
|
||||
> : ^^^
|
||||
>1 : 1
|
||||
> : ^
|
||||
>1 : 1
|
||||
> : ^
|
||||
|
||||
const c: { a: any } & { a: 1 } = { a: 1 };
|
||||
>c : { a: any; } & { a: 1; }
|
||||
> : ^^^^^ ^^^^^^^^^^^ ^^^
|
||||
>a : any
|
||||
>a : 1
|
||||
> : ^
|
||||
>{ a: 1 } : { a: 1; }
|
||||
> : ^^^^^^^^^
|
||||
>a : 1
|
||||
> : ^
|
||||
>1 : 1
|
||||
> : ^
|
||||
|
||||
const d: (() => { a: 1 }) & (() => { a: any }) = () => ({
|
||||
>d : (() => { a: 1; }) & (() => { a: any; })
|
||||
> : ^^^^^^^ ^^^^^^^^^^^ ^
|
||||
>a : 1
|
||||
> : ^
|
||||
>a : any
|
||||
>() => ({ a: 1,}) : () => { a: 1; }
|
||||
> : ^^^^^^^^^^^^^^^
|
||||
>({ a: 1,}) : { a: 1; }
|
||||
> : ^^^^^^^^^
|
||||
>{ a: 1,} : { a: 1; }
|
||||
> : ^^^^^^^^^
|
||||
|
||||
a: 1,
|
||||
>a : 1
|
||||
> : ^
|
||||
>1 : 1
|
||||
> : ^
|
||||
|
||||
});
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts(33,12): error TS2322: Type '"bar"' is not assignable to type '"foo"'.
|
||||
contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts(48,15): error TS2322: Type '"bar"' is not assignable to type '"foo"'.
|
||||
|
||||
|
||||
==== contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts (2 errors) ====
|
||||
declare function test1(
|
||||
arg: { a: (arg: number) => void } & { [k: string]: (arg: any) => void },
|
||||
): unknown;
|
||||
|
||||
test1({
|
||||
a: (arg) => {},
|
||||
b: (arg) => {},
|
||||
});
|
||||
|
||||
declare function test2(
|
||||
arg: { a: (arg: { foo: string }) => void } & {
|
||||
[k: string]: (arg: { foo: any }) => void;
|
||||
},
|
||||
): unknown;
|
||||
|
||||
test2({
|
||||
a: (arg) => {},
|
||||
b: (arg) => {},
|
||||
});
|
||||
|
||||
declare function test3(
|
||||
arg: { a: () => "foo" } & {
|
||||
[k: string]: () => any;
|
||||
},
|
||||
): unknown;
|
||||
|
||||
test3({
|
||||
a: () => "foo",
|
||||
b: () => "bar",
|
||||
});
|
||||
|
||||
test3({
|
||||
a: () => "bar",
|
||||
~~~~~
|
||||
!!! error TS2322: Type '"bar"' is not assignable to type '"foo"'.
|
||||
!!! related TS6502 contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts:22:13: The expected type comes from the return type of this signature.
|
||||
});
|
||||
|
||||
declare function test4(
|
||||
arg: { a: () => { prop: "foo" } } & {
|
||||
[k: string]: () => { prop: any };
|
||||
},
|
||||
): unknown;
|
||||
|
||||
test4({
|
||||
a: () => ({ prop: "foo" }),
|
||||
b: () => ({ prop: "bar" }),
|
||||
});
|
||||
|
||||
test4({
|
||||
a: () => ({ prop: "bar" }),
|
||||
~~~~
|
||||
!!! error TS2322: Type '"bar"' is not assignable to type '"foo"'.
|
||||
!!! related TS6500 contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts:37:21: The expected type comes from property 'prop' which is declared here on type '{ prop: "foo"; }'
|
||||
});
|
||||
|
|
@ -0,0 +1,127 @@
|
|||
//// [tests/cases/compiler/contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts] ////
|
||||
|
||||
=== contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts ===
|
||||
declare function test1(
|
||||
>test1 : Symbol(test1, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 0, 0))
|
||||
|
||||
arg: { a: (arg: number) => void } & { [k: string]: (arg: any) => void },
|
||||
>arg : Symbol(arg, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 0, 23))
|
||||
>a : Symbol(a, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 1, 8))
|
||||
>arg : Symbol(arg, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 1, 13))
|
||||
>k : Symbol(k, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 1, 41))
|
||||
>arg : Symbol(arg, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 1, 54))
|
||||
|
||||
): unknown;
|
||||
|
||||
test1({
|
||||
>test1 : Symbol(test1, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 0, 0))
|
||||
|
||||
a: (arg) => {},
|
||||
>a : Symbol(a, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 4, 7))
|
||||
>arg : Symbol(arg, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 5, 6))
|
||||
|
||||
b: (arg) => {},
|
||||
>b : Symbol(b, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 5, 17))
|
||||
>arg : Symbol(arg, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 6, 6))
|
||||
|
||||
});
|
||||
|
||||
declare function test2(
|
||||
>test2 : Symbol(test2, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 7, 3))
|
||||
|
||||
arg: { a: (arg: { foo: string }) => void } & {
|
||||
>arg : Symbol(arg, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 9, 23))
|
||||
>a : Symbol(a, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 10, 8))
|
||||
>arg : Symbol(arg, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 10, 13))
|
||||
>foo : Symbol(foo, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 10, 19))
|
||||
|
||||
[k: string]: (arg: { foo: any }) => void;
|
||||
>k : Symbol(k, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 11, 5))
|
||||
>arg : Symbol(arg, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 11, 18))
|
||||
>foo : Symbol(foo, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 11, 24))
|
||||
|
||||
},
|
||||
): unknown;
|
||||
|
||||
test2({
|
||||
>test2 : Symbol(test2, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 7, 3))
|
||||
|
||||
a: (arg) => {},
|
||||
>a : Symbol(a, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 15, 7))
|
||||
>arg : Symbol(arg, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 16, 6))
|
||||
|
||||
b: (arg) => {},
|
||||
>b : Symbol(b, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 16, 17))
|
||||
>arg : Symbol(arg, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 17, 6))
|
||||
|
||||
});
|
||||
|
||||
declare function test3(
|
||||
>test3 : Symbol(test3, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 18, 3))
|
||||
|
||||
arg: { a: () => "foo" } & {
|
||||
>arg : Symbol(arg, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 20, 23))
|
||||
>a : Symbol(a, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 21, 8))
|
||||
|
||||
[k: string]: () => any;
|
||||
>k : Symbol(k, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 22, 5))
|
||||
|
||||
},
|
||||
): unknown;
|
||||
|
||||
test3({
|
||||
>test3 : Symbol(test3, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 18, 3))
|
||||
|
||||
a: () => "foo",
|
||||
>a : Symbol(a, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 26, 7))
|
||||
|
||||
b: () => "bar",
|
||||
>b : Symbol(b, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 27, 17))
|
||||
|
||||
});
|
||||
|
||||
test3({
|
||||
>test3 : Symbol(test3, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 18, 3))
|
||||
|
||||
a: () => "bar",
|
||||
>a : Symbol(a, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 31, 7))
|
||||
|
||||
});
|
||||
|
||||
declare function test4(
|
||||
>test4 : Symbol(test4, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 33, 3))
|
||||
|
||||
arg: { a: () => { prop: "foo" } } & {
|
||||
>arg : Symbol(arg, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 35, 23))
|
||||
>a : Symbol(a, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 36, 8))
|
||||
>prop : Symbol(prop, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 36, 19))
|
||||
|
||||
[k: string]: () => { prop: any };
|
||||
>k : Symbol(k, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 37, 5))
|
||||
>prop : Symbol(prop, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 37, 24))
|
||||
|
||||
},
|
||||
): unknown;
|
||||
|
||||
test4({
|
||||
>test4 : Symbol(test4, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 33, 3))
|
||||
|
||||
a: () => ({ prop: "foo" }),
|
||||
>a : Symbol(a, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 41, 7))
|
||||
>prop : Symbol(prop, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 42, 13))
|
||||
|
||||
b: () => ({ prop: "bar" }),
|
||||
>b : Symbol(b, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 42, 29))
|
||||
>prop : Symbol(prop, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 43, 13))
|
||||
|
||||
});
|
||||
|
||||
test4({
|
||||
>test4 : Symbol(test4, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 33, 3))
|
||||
|
||||
a: () => ({ prop: "bar" }),
|
||||
>a : Symbol(a, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 46, 7))
|
||||
>prop : Symbol(prop, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts, 47, 13))
|
||||
|
||||
});
|
||||
|
|
@ -0,0 +1,242 @@
|
|||
//// [tests/cases/compiler/contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts] ////
|
||||
|
||||
=== contextualTypeBasedOnIntersectionWithAnyInTheMix4.ts ===
|
||||
declare function test1(
|
||||
>test1 : (arg: { a: (arg: number) => void; } & { [k: string]: (arg: any) => void; }) => unknown
|
||||
> : ^ ^^ ^^^^^
|
||||
|
||||
arg: { a: (arg: number) => void } & { [k: string]: (arg: any) => void },
|
||||
>arg : { a: (arg: number) => void; } & { [k: string]: (arg: any) => void; }
|
||||
> : ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^^^ ^^^
|
||||
>a : (arg: number) => void
|
||||
> : ^ ^^ ^^^^^
|
||||
>arg : number
|
||||
> : ^^^^^^
|
||||
>k : string
|
||||
> : ^^^^^^
|
||||
>arg : any
|
||||
> : ^^^
|
||||
|
||||
): unknown;
|
||||
|
||||
test1({
|
||||
>test1({ a: (arg) => {}, b: (arg) => {},}) : unknown
|
||||
> : ^^^^^^^
|
||||
>test1 : (arg: { a: (arg: number) => void; } & { [k: string]: (arg: any) => void; }) => unknown
|
||||
> : ^ ^^ ^^^^^
|
||||
>{ a: (arg) => {}, b: (arg) => {},} : { a: (arg: number) => void; b: (arg: any) => void; }
|
||||
> : ^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^
|
||||
|
||||
a: (arg) => {},
|
||||
>a : (arg: number) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^
|
||||
>(arg) => {} : (arg: number) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^
|
||||
>arg : number
|
||||
> : ^^^^^^
|
||||
|
||||
b: (arg) => {},
|
||||
>b : (arg: any) => void
|
||||
> : ^ ^^^^^^^^^^^^^^
|
||||
>(arg) => {} : (arg: any) => void
|
||||
> : ^ ^^^^^^^^^^^^^^
|
||||
>arg : any
|
||||
> : ^^^
|
||||
|
||||
});
|
||||
|
||||
declare function test2(
|
||||
>test2 : (arg: { a: (arg: { foo: string; }) => void; } & { [k: string]: (arg: { foo: any; }) => void; }) => unknown
|
||||
> : ^ ^^ ^^^^^
|
||||
|
||||
arg: { a: (arg: { foo: string }) => void } & {
|
||||
>arg : { a: (arg: { foo: string; }) => void; } & { [k: string]: (arg: { foo: any; }) => void; }
|
||||
> : ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^^^ ^^^
|
||||
>a : (arg: { foo: string; }) => void
|
||||
> : ^ ^^ ^^^^^
|
||||
>arg : { foo: string; }
|
||||
> : ^^^^^^^ ^^^
|
||||
>foo : string
|
||||
> : ^^^^^^
|
||||
|
||||
[k: string]: (arg: { foo: any }) => void;
|
||||
>k : string
|
||||
> : ^^^^^^
|
||||
>arg : { foo: any; }
|
||||
> : ^^^^^^^ ^^^
|
||||
>foo : any
|
||||
> : ^^^
|
||||
|
||||
},
|
||||
): unknown;
|
||||
|
||||
test2({
|
||||
>test2({ a: (arg) => {}, b: (arg) => {},}) : unknown
|
||||
> : ^^^^^^^
|
||||
>test2 : (arg: { a: (arg: { foo: string; }) => void; } & { [k: string]: (arg: { foo: any; }) => void; }) => unknown
|
||||
> : ^ ^^ ^^^^^
|
||||
>{ a: (arg) => {}, b: (arg) => {},} : { a: (arg: { foo: string; }) => void; b: (arg: { foo: any; }) => void; }
|
||||
> : ^^^^^^ ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^^^^^^^
|
||||
|
||||
a: (arg) => {},
|
||||
>a : (arg: { foo: string; }) => void
|
||||
> : ^ ^^^^^^^^^ ^^^^^^^^^^^^
|
||||
>(arg) => {} : (arg: { foo: string; }) => void
|
||||
> : ^ ^^^^^^^^^ ^^^^^^^^^^^^
|
||||
>arg : { foo: string; }
|
||||
> : ^^^^^^^ ^^^
|
||||
|
||||
b: (arg) => {},
|
||||
>b : (arg: { foo: any; }) => void
|
||||
> : ^ ^^^^^^^^^ ^^^^^^^^^^^^
|
||||
>(arg) => {} : (arg: { foo: any; }) => void
|
||||
> : ^ ^^^^^^^^^ ^^^^^^^^^^^^
|
||||
>arg : { foo: any; }
|
||||
> : ^^^^^^^ ^^^
|
||||
|
||||
});
|
||||
|
||||
declare function test3(
|
||||
>test3 : (arg: { a: () => "foo"; } & { [k: string]: () => any; }) => unknown
|
||||
> : ^ ^^ ^^^^^
|
||||
|
||||
arg: { a: () => "foo" } & {
|
||||
>arg : { a: () => "foo"; } & { [k: string]: () => any; }
|
||||
> : ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^
|
||||
>a : () => "foo"
|
||||
> : ^^^^^^
|
||||
|
||||
[k: string]: () => any;
|
||||
>k : string
|
||||
> : ^^^^^^
|
||||
|
||||
},
|
||||
): unknown;
|
||||
|
||||
test3({
|
||||
>test3({ a: () => "foo", b: () => "bar",}) : unknown
|
||||
> : ^^^^^^^
|
||||
>test3 : (arg: { a: () => "foo"; } & { [k: string]: () => any; }) => unknown
|
||||
> : ^ ^^ ^^^^^
|
||||
>{ a: () => "foo", b: () => "bar",} : { a: () => "foo"; b: () => string; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
a: () => "foo",
|
||||
>a : () => "foo"
|
||||
> : ^^^^^^^^^^^
|
||||
>() => "foo" : () => "foo"
|
||||
> : ^^^^^^^^^^^
|
||||
>"foo" : "foo"
|
||||
> : ^^^^^
|
||||
|
||||
b: () => "bar",
|
||||
>b : () => string
|
||||
> : ^^^^^^^^^^^^
|
||||
>() => "bar" : () => string
|
||||
> : ^^^^^^^^^^^^
|
||||
>"bar" : "bar"
|
||||
> : ^^^^^
|
||||
|
||||
});
|
||||
|
||||
test3({
|
||||
>test3({ a: () => "bar",}) : unknown
|
||||
> : ^^^^^^^
|
||||
>test3 : (arg: { a: () => "foo"; } & { [k: string]: () => any; }) => unknown
|
||||
> : ^ ^^ ^^^^^
|
||||
>{ a: () => "bar",} : { a: () => "bar"; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
a: () => "bar",
|
||||
>a : () => "bar"
|
||||
> : ^^^^^^^^^^^
|
||||
>() => "bar" : () => "bar"
|
||||
> : ^^^^^^^^^^^
|
||||
>"bar" : "bar"
|
||||
> : ^^^^^
|
||||
|
||||
});
|
||||
|
||||
declare function test4(
|
||||
>test4 : (arg: { a: () => { prop: "foo"; }; } & { [k: string]: () => { prop: any; }; }) => unknown
|
||||
> : ^ ^^ ^^^^^
|
||||
|
||||
arg: { a: () => { prop: "foo" } } & {
|
||||
>arg : { a: () => { prop: "foo"; }; } & { [k: string]: () => { prop: any; }; }
|
||||
> : ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^
|
||||
>a : () => { prop: "foo"; }
|
||||
> : ^^^^^^
|
||||
>prop : "foo"
|
||||
> : ^^^^^
|
||||
|
||||
[k: string]: () => { prop: any };
|
||||
>k : string
|
||||
> : ^^^^^^
|
||||
>prop : any
|
||||
> : ^^^
|
||||
|
||||
},
|
||||
): unknown;
|
||||
|
||||
test4({
|
||||
>test4({ a: () => ({ prop: "foo" }), b: () => ({ prop: "bar" }),}) : unknown
|
||||
> : ^^^^^^^
|
||||
>test4 : (arg: { a: () => { prop: "foo"; }; } & { [k: string]: () => { prop: any; }; }) => unknown
|
||||
> : ^ ^^ ^^^^^
|
||||
>{ a: () => ({ prop: "foo" }), b: () => ({ prop: "bar" }),} : { a: () => { prop: "foo"; }; b: () => { prop: string; }; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
a: () => ({ prop: "foo" }),
|
||||
>a : () => { prop: "foo"; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^
|
||||
>() => ({ prop: "foo" }) : () => { prop: "foo"; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^
|
||||
>({ prop: "foo" }) : { prop: "foo"; }
|
||||
> : ^^^^^^^^^^^^^^^^
|
||||
>{ prop: "foo" } : { prop: "foo"; }
|
||||
> : ^^^^^^^^^^^^^^^^
|
||||
>prop : "foo"
|
||||
> : ^^^^^
|
||||
>"foo" : "foo"
|
||||
> : ^^^^^
|
||||
|
||||
b: () => ({ prop: "bar" }),
|
||||
>b : () => { prop: string; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>() => ({ prop: "bar" }) : () => { prop: string; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>({ prop: "bar" }) : { prop: string; }
|
||||
> : ^^^^^^^^^^^^^^^^^
|
||||
>{ prop: "bar" } : { prop: string; }
|
||||
> : ^^^^^^^^^^^^^^^^^
|
||||
>prop : string
|
||||
> : ^^^^^^
|
||||
>"bar" : "bar"
|
||||
> : ^^^^^
|
||||
|
||||
});
|
||||
|
||||
test4({
|
||||
>test4({ a: () => ({ prop: "bar" }),}) : unknown
|
||||
> : ^^^^^^^
|
||||
>test4 : (arg: { a: () => { prop: "foo"; }; } & { [k: string]: () => { prop: any; }; }) => unknown
|
||||
> : ^ ^^ ^^^^^
|
||||
>{ a: () => ({ prop: "bar" }),} : { a: () => { prop: "bar"; }; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
a: () => ({ prop: "bar" }),
|
||||
>a : () => { prop: "bar"; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^
|
||||
>() => ({ prop: "bar" }) : () => { prop: "bar"; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^
|
||||
>({ prop: "bar" }) : { prop: "bar"; }
|
||||
> : ^^^^^^^^^^^^^^^^
|
||||
>{ prop: "bar" } : { prop: "bar"; }
|
||||
> : ^^^^^^^^^^^^^^^^
|
||||
>prop : "bar"
|
||||
> : ^^^^^
|
||||
>"bar" : "bar"
|
||||
> : ^^^^^
|
||||
|
||||
});
|
||||
|
|
@ -0,0 +1,167 @@
|
|||
//// [tests/cases/compiler/contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts] ////
|
||||
|
||||
=== contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts ===
|
||||
type ComputedGetter<T> = (oldValue?: T) => T;
|
||||
>ComputedGetter : Symbol(ComputedGetter, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 0, 0))
|
||||
>T : Symbol(T, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 0, 20))
|
||||
>oldValue : Symbol(oldValue, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 0, 26))
|
||||
>T : Symbol(T, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 0, 20))
|
||||
>T : Symbol(T, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 0, 20))
|
||||
|
||||
type ComputedOptions = Record<string, ComputedGetter<any>>;
|
||||
>ComputedOptions : Symbol(ComputedOptions, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 0, 45))
|
||||
>Record : Symbol(Record, Decl(lib.es5.d.ts, --, --))
|
||||
>ComputedGetter : Symbol(ComputedGetter, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 0, 0))
|
||||
|
||||
type ExtractComputedReturns<T extends any> = {
|
||||
>ExtractComputedReturns : Symbol(ExtractComputedReturns, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 1, 59))
|
||||
>T : Symbol(T, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 3, 28))
|
||||
|
||||
[key in keyof T]: T[key] extends (...args: any[]) => infer TReturn
|
||||
>key : Symbol(key, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 4, 3))
|
||||
>T : Symbol(T, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 3, 28))
|
||||
>T : Symbol(T, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 3, 28))
|
||||
>key : Symbol(key, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 4, 3))
|
||||
>args : Symbol(args, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 4, 36))
|
||||
>TReturn : Symbol(TReturn, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 4, 60))
|
||||
|
||||
? TReturn
|
||||
>TReturn : Symbol(TReturn, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 4, 60))
|
||||
|
||||
: never;
|
||||
};
|
||||
|
||||
interface ComponentOptionsBase<D, C extends ComputedOptions> {
|
||||
>ComponentOptionsBase : Symbol(ComponentOptionsBase, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 7, 2))
|
||||
>D : Symbol(D, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 9, 31))
|
||||
>C : Symbol(C, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 9, 33))
|
||||
>ComputedOptions : Symbol(ComputedOptions, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 0, 45))
|
||||
|
||||
data?: D;
|
||||
>data : Symbol(ComponentOptionsBase.data, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 9, 62))
|
||||
>D : Symbol(D, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 9, 31))
|
||||
|
||||
computed?: C;
|
||||
>computed : Symbol(ComponentOptionsBase.computed, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 10, 11))
|
||||
>C : Symbol(C, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 9, 33))
|
||||
}
|
||||
|
||||
type ComponentPublicInstance<D = {}, C extends ComputedOptions = {}> = D &
|
||||
>ComponentPublicInstance : Symbol(ComponentPublicInstance, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 12, 1))
|
||||
>D : Symbol(D, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 14, 29))
|
||||
>C : Symbol(C, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 14, 36))
|
||||
>ComputedOptions : Symbol(ComputedOptions, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 0, 45))
|
||||
>D : Symbol(D, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 14, 29))
|
||||
|
||||
ExtractComputedReturns<C>;
|
||||
>ExtractComputedReturns : Symbol(ExtractComputedReturns, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 1, 59))
|
||||
>C : Symbol(C, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 14, 36))
|
||||
|
||||
type ComponentOptions<
|
||||
>ComponentOptions : Symbol(ComponentOptions, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 15, 28))
|
||||
|
||||
D = any,
|
||||
>D : Symbol(D, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 17, 22))
|
||||
|
||||
C extends ComputedOptions = any,
|
||||
>C : Symbol(C, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 18, 10))
|
||||
>ComputedOptions : Symbol(ComputedOptions, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 0, 45))
|
||||
|
||||
> = ComponentOptionsBase<D, C> & ThisType<ComponentPublicInstance<D, C>>;
|
||||
>ComponentOptionsBase : Symbol(ComponentOptionsBase, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 7, 2))
|
||||
>D : Symbol(D, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 17, 22))
|
||||
>C : Symbol(C, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 18, 10))
|
||||
>ThisType : Symbol(ThisType, Decl(lib.es5.d.ts, --, --))
|
||||
>ComponentPublicInstance : Symbol(ComponentPublicInstance, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 12, 1))
|
||||
>D : Symbol(D, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 17, 22))
|
||||
>C : Symbol(C, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 18, 10))
|
||||
|
||||
interface App {
|
||||
>App : Symbol(App, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 20, 73))
|
||||
|
||||
mixin(mixin: ComponentOptions): this;
|
||||
>mixin : Symbol(App.mixin, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 22, 15))
|
||||
>mixin : Symbol(mixin, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 23, 8))
|
||||
>ComponentOptions : Symbol(ComponentOptions, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 15, 28))
|
||||
}
|
||||
|
||||
interface InjectionKey<T> extends Symbol {}
|
||||
>InjectionKey : Symbol(InjectionKey, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 24, 1))
|
||||
>T : Symbol(T, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 26, 23))
|
||||
>Symbol : Symbol(Symbol, Decl(lib.es5.d.ts, --, --))
|
||||
|
||||
interface Ref<T> {
|
||||
>Ref : Symbol(Ref, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 26, 43))
|
||||
>T : Symbol(T, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 28, 14))
|
||||
|
||||
_v: T;
|
||||
>_v : Symbol(Ref._v, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 28, 18))
|
||||
>T : Symbol(T, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 28, 14))
|
||||
}
|
||||
|
||||
declare function reactive<T extends object>(target: T): Ref<T>;
|
||||
>reactive : Symbol(reactive, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 30, 1))
|
||||
>T : Symbol(T, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 32, 26))
|
||||
>target : Symbol(target, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 32, 44))
|
||||
>T : Symbol(T, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 32, 26))
|
||||
>Ref : Symbol(Ref, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 26, 43))
|
||||
>T : Symbol(T, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 32, 26))
|
||||
|
||||
interface ThemeInstance {
|
||||
>ThemeInstance : Symbol(ThemeInstance, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 32, 63))
|
||||
|
||||
readonly name: Readonly<Ref<string>>;
|
||||
>name : Symbol(ThemeInstance.name, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 34, 25))
|
||||
>Readonly : Symbol(Readonly, Decl(lib.es5.d.ts, --, --))
|
||||
>Ref : Symbol(Ref, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 26, 43))
|
||||
}
|
||||
|
||||
declare const ThemeSymbol: InjectionKey<ThemeInstance>;
|
||||
>ThemeSymbol : Symbol(ThemeSymbol, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 38, 13))
|
||||
>InjectionKey : Symbol(InjectionKey, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 24, 1))
|
||||
>ThemeInstance : Symbol(ThemeInstance, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 32, 63))
|
||||
|
||||
declare function inject(
|
||||
>inject : Symbol(inject, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 38, 55))
|
||||
|
||||
this: ComponentPublicInstance,
|
||||
>this : Symbol(this, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 40, 24))
|
||||
>ComponentPublicInstance : Symbol(ComponentPublicInstance, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 12, 1))
|
||||
|
||||
key: InjectionKey<any> | string,
|
||||
>key : Symbol(key, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 41, 32))
|
||||
>InjectionKey : Symbol(InjectionKey, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 24, 1))
|
||||
|
||||
): any;
|
||||
|
||||
declare const app: App;
|
||||
>app : Symbol(app, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 45, 13))
|
||||
>App : Symbol(App, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 20, 73))
|
||||
|
||||
app.mixin({
|
||||
>app.mixin : Symbol(App.mixin, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 22, 15))
|
||||
>app : Symbol(app, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 45, 13))
|
||||
>mixin : Symbol(App.mixin, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 22, 15))
|
||||
|
||||
computed: {
|
||||
>computed : Symbol(computed, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 46, 11))
|
||||
|
||||
$vuetify() {
|
||||
>$vuetify : Symbol($vuetify, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 47, 13))
|
||||
|
||||
// this is meant to be `any` here
|
||||
return reactive({
|
||||
>reactive : Symbol(reactive, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 30, 1))
|
||||
|
||||
theme: inject.call(this, ThemeSymbol),
|
||||
>theme : Symbol(theme, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 50, 23))
|
||||
>inject.call : Symbol(CallableFunction.call, Decl(lib.es5.d.ts, --, --))
|
||||
>inject : Symbol(inject, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 38, 55))
|
||||
>call : Symbol(CallableFunction.call, Decl(lib.es5.d.ts, --, --))
|
||||
>ThemeSymbol : Symbol(ThemeSymbol, Decl(contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts, 38, 13))
|
||||
|
||||
});
|
||||
},
|
||||
},
|
||||
});
|
||||
|
|
@ -0,0 +1,148 @@
|
|||
//// [tests/cases/compiler/contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts] ////
|
||||
|
||||
=== contextualTypeBasedOnIntersectionWithAnyInTheMix5.ts ===
|
||||
type ComputedGetter<T> = (oldValue?: T) => T;
|
||||
>ComputedGetter : ComputedGetter<T>
|
||||
> : ^^^^^^^^^^^^^^^^^
|
||||
>oldValue : T | undefined
|
||||
> : ^^^^^^^^^^^^^
|
||||
|
||||
type ComputedOptions = Record<string, ComputedGetter<any>>;
|
||||
>ComputedOptions : ComputedOptions
|
||||
> : ^^^^^^^^^^^^^^^
|
||||
|
||||
type ExtractComputedReturns<T extends any> = {
|
||||
>ExtractComputedReturns : ExtractComputedReturns<T>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
[key in keyof T]: T[key] extends (...args: any[]) => infer TReturn
|
||||
>args : any[]
|
||||
> : ^^^^^
|
||||
|
||||
? TReturn
|
||||
: never;
|
||||
};
|
||||
|
||||
interface ComponentOptionsBase<D, C extends ComputedOptions> {
|
||||
data?: D;
|
||||
>data : D | undefined
|
||||
> : ^^^^^^^^^^^^^
|
||||
|
||||
computed?: C;
|
||||
>computed : C | undefined
|
||||
> : ^^^^^^^^^^^^^
|
||||
}
|
||||
|
||||
type ComponentPublicInstance<D = {}, C extends ComputedOptions = {}> = D &
|
||||
>ComponentPublicInstance : ComponentPublicInstance<D, C>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
ExtractComputedReturns<C>;
|
||||
|
||||
type ComponentOptions<
|
||||
>ComponentOptions : ComponentOptions<D, C>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
D = any,
|
||||
C extends ComputedOptions = any,
|
||||
> = ComponentOptionsBase<D, C> & ThisType<ComponentPublicInstance<D, C>>;
|
||||
|
||||
interface App {
|
||||
mixin(mixin: ComponentOptions): this;
|
||||
>mixin : (mixin: ComponentOptions) => this
|
||||
> : ^ ^^ ^^^^^
|
||||
>mixin : ComponentOptions<any, any>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
}
|
||||
|
||||
interface InjectionKey<T> extends Symbol {}
|
||||
|
||||
interface Ref<T> {
|
||||
_v: T;
|
||||
>_v : T
|
||||
> : ^
|
||||
}
|
||||
|
||||
declare function reactive<T extends object>(target: T): Ref<T>;
|
||||
>reactive : <T extends object>(target: T) => Ref<T>
|
||||
> : ^ ^^^^^^^^^ ^^ ^^ ^^^^^
|
||||
>target : T
|
||||
> : ^
|
||||
|
||||
interface ThemeInstance {
|
||||
readonly name: Readonly<Ref<string>>;
|
||||
>name : Readonly<Ref<string>>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^
|
||||
}
|
||||
|
||||
declare const ThemeSymbol: InjectionKey<ThemeInstance>;
|
||||
>ThemeSymbol : InjectionKey<ThemeInstance>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
declare function inject(
|
||||
>inject : (this: ComponentPublicInstance, key: InjectionKey<any> | string) => any
|
||||
> : ^ ^^ ^^ ^^ ^^^^^
|
||||
|
||||
this: ComponentPublicInstance,
|
||||
>this : ExtractComputedReturns<{}>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
key: InjectionKey<any> | string,
|
||||
>key : string | InjectionKey<any>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
): any;
|
||||
|
||||
declare const app: App;
|
||||
>app : App
|
||||
> : ^^^
|
||||
|
||||
app.mixin({
|
||||
>app.mixin({ computed: { $vuetify() { // this is meant to be `any` here return reactive({ theme: inject.call(this, ThemeSymbol), }); }, },}) : App
|
||||
> : ^^^
|
||||
>app.mixin : (mixin: ComponentOptions) => App
|
||||
> : ^ ^^ ^^^^^^^^
|
||||
>app : App
|
||||
> : ^^^
|
||||
>mixin : (mixin: ComponentOptions) => App
|
||||
> : ^ ^^ ^^^^^^^^
|
||||
>{ computed: { $vuetify() { // this is meant to be `any` here return reactive({ theme: inject.call(this, ThemeSymbol), }); }, },} : { computed: { $vuetify(): Ref<{ theme: any; }>; }; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
computed: {
|
||||
>computed : { $vuetify(): Ref<{ theme: any; }>; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>{ $vuetify() { // this is meant to be `any` here return reactive({ theme: inject.call(this, ThemeSymbol), }); }, } : { $vuetify(): Ref<{ theme: any; }>; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
$vuetify() {
|
||||
>$vuetify : () => Ref<{ theme: any; }>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
// this is meant to be `any` here
|
||||
return reactive({
|
||||
>reactive({ theme: inject.call(this, ThemeSymbol), }) : Ref<{ theme: any; }>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^
|
||||
>reactive : <T extends object>(target: T) => Ref<T>
|
||||
> : ^ ^^^^^^^^^ ^^ ^^ ^^^^^
|
||||
>{ theme: inject.call(this, ThemeSymbol), } : { theme: any; }
|
||||
> : ^^^^^^^^^^^^^^^
|
||||
|
||||
theme: inject.call(this, ThemeSymbol),
|
||||
>theme : any
|
||||
>inject.call(this, ThemeSymbol) : any
|
||||
>inject.call : <T, A extends any[], R>(this: (this: T, ...args: A) => R, thisArg: T, ...args: A) => R
|
||||
> : ^ ^^ ^^^^^^^^^ ^^ ^^ ^^ ^^ ^^ ^^^^^ ^^ ^^^^^
|
||||
>inject : (this: ComponentPublicInstance, key: InjectionKey<any> | string) => any
|
||||
> : ^ ^^ ^^ ^^ ^^^^^
|
||||
>call : <T, A extends any[], R>(this: (this: T, ...args: A) => R, thisArg: T, ...args: A) => R
|
||||
> : ^ ^^ ^^^^^^^^^ ^^ ^^ ^^ ^^ ^^ ^^^^^ ^^ ^^^^^
|
||||
>this : any
|
||||
>ThemeSymbol : InjectionKey<ThemeInstance>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
});
|
||||
},
|
||||
},
|
||||
});
|
||||
|
|
@ -0,0 +1,155 @@
|
|||
contextualTypeFunctionObjectPropertyIntersection.ts(84,5): error TS2353: Object literal may only specify known properties, and 'bar' does not exist in type '{ FOO?: Action<{ type: "FOO"; }> | undefined; } & { "*"?: Action<{ type: "FOO"; } | { type: "bar"; }> | undefined; }'.
|
||||
contextualTypeFunctionObjectPropertyIntersection.ts(84,11): error TS7006: Parameter 'ev' implicitly has an 'any' type.
|
||||
|
||||
|
||||
==== contextualTypeFunctionObjectPropertyIntersection.ts (2 errors) ====
|
||||
// repro from #48812
|
||||
|
||||
type Action<TEvent extends { type: string }> = (ev: TEvent) => void;
|
||||
|
||||
interface MachineConfig<TEvent extends { type: string }> {
|
||||
schema: {
|
||||
events: TEvent;
|
||||
};
|
||||
on?: {
|
||||
[K in TEvent["type"]]?: Action<TEvent extends { type: K } ? TEvent : never>;
|
||||
} & {
|
||||
"*"?: Action<TEvent>;
|
||||
};
|
||||
}
|
||||
|
||||
declare function createMachine<TEvent extends { type: string }>(
|
||||
config: MachineConfig<TEvent>
|
||||
): void;
|
||||
|
||||
createMachine({
|
||||
schema: {
|
||||
events: {} as { type: "FOO" } | { type: "BAR" },
|
||||
},
|
||||
on: {
|
||||
FOO: (ev) => {
|
||||
ev.type; // should be 'FOO'
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
createMachine({
|
||||
schema: {
|
||||
events: {} as { type: "FOO" } | { type: "BAR" },
|
||||
},
|
||||
on: {
|
||||
"*": (ev) => {
|
||||
ev.type; // should be 'FOO' | 'BAR'
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
interface MachineConfig2<TEvent extends { type: string }> {
|
||||
schema: {
|
||||
events: TEvent;
|
||||
};
|
||||
on?: {
|
||||
[K in TEvent["type"] as K extends Uppercase<string> ? K : never]?: Action<TEvent extends { type: K } ? TEvent : never>;
|
||||
} & {
|
||||
"*"?: Action<TEvent>;
|
||||
};
|
||||
}
|
||||
|
||||
declare function createMachine2<TEvent extends { type: string }>(
|
||||
config: MachineConfig2<TEvent>
|
||||
): void;
|
||||
|
||||
createMachine2({
|
||||
schema: {
|
||||
events: {} as { type: "FOO" } | { type: "bar" },
|
||||
},
|
||||
on: {
|
||||
FOO: (ev) => {
|
||||
ev.type; // should be 'FOO'
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
createMachine2({
|
||||
schema: {
|
||||
events: {} as { type: "FOO" } | { type: "bar" },
|
||||
},
|
||||
on: {
|
||||
"*": (ev) => {
|
||||
ev.type; // should be 'FOO' | 'bar'
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
createMachine2({
|
||||
schema: {
|
||||
events: {} as { type: "FOO" } | { type: "bar" },
|
||||
},
|
||||
on: {
|
||||
bar: (ev) => {
|
||||
~~~
|
||||
!!! error TS2353: Object literal may only specify known properties, and 'bar' does not exist in type '{ FOO?: Action<{ type: "FOO"; }> | undefined; } & { "*"?: Action<{ type: "FOO"; } | { type: "bar"; }> | undefined; }'.
|
||||
!!! related TS6500 contextualTypeFunctionObjectPropertyIntersection.ts:46:3: The expected type comes from property 'on' which is declared here on type 'MachineConfig2<{ type: "FOO"; } | { type: "bar"; }>'
|
||||
~~
|
||||
!!! error TS7006: Parameter 'ev' implicitly has an 'any' type.
|
||||
ev // any
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
// repro from #49307#issuecomment-1143103607
|
||||
|
||||
declare function createSlice<T>(
|
||||
reducers: { [K: string]: (state: string) => void } & {
|
||||
[K in keyof T]: object;
|
||||
}
|
||||
): void;
|
||||
|
||||
createSlice({
|
||||
f(a) {},
|
||||
});
|
||||
|
||||
// repro from #49307#issuecomment-1196014488
|
||||
|
||||
type Validate<T> = T & { [K in keyof T]: object }
|
||||
declare function f<S, T extends Record<string, (state: S) => any>>(s: S, x: Validate<T>): void;
|
||||
|
||||
f(0, {
|
||||
foo: s => s + 1,
|
||||
})
|
||||
|
||||
// repro from 49307#issuecomment-1195858950
|
||||
|
||||
type SliceCaseReducers<State> = Record<string, (state: State) => State | void>;
|
||||
|
||||
type ValidateSliceCaseReducers<S, ACR extends SliceCaseReducers<S>> = ACR & {
|
||||
[T in keyof ACR]: ACR[T] extends {
|
||||
reducer(s: S, action?: infer A): any;
|
||||
}
|
||||
? {
|
||||
prepare(...a: never[]): Omit<A, "type">;
|
||||
}
|
||||
: {};
|
||||
};
|
||||
|
||||
declare function createSlice<
|
||||
State,
|
||||
CaseReducers extends SliceCaseReducers<State>
|
||||
>(options: {
|
||||
initialState: State | (() => State);
|
||||
reducers: ValidateSliceCaseReducers<State, CaseReducers>;
|
||||
}): void;
|
||||
|
||||
export const clientSlice = createSlice({
|
||||
initialState: {
|
||||
username: "",
|
||||
isLoggedIn: false,
|
||||
userId: "",
|
||||
avatar: "",
|
||||
},
|
||||
reducers: {
|
||||
onClientUserChanged(state) {},
|
||||
},
|
||||
});
|
||||
|
||||
|
|
@ -0,0 +1,402 @@
|
|||
//// [tests/cases/compiler/contextualTypeFunctionObjectPropertyIntersection.ts] ////
|
||||
|
||||
=== contextualTypeFunctionObjectPropertyIntersection.ts ===
|
||||
// repro from #48812
|
||||
|
||||
type Action<TEvent extends { type: string }> = (ev: TEvent) => void;
|
||||
>Action : Symbol(Action, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 0, 0))
|
||||
>TEvent : Symbol(TEvent, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 2, 12))
|
||||
>type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 2, 28))
|
||||
>ev : Symbol(ev, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 2, 48))
|
||||
>TEvent : Symbol(TEvent, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 2, 12))
|
||||
|
||||
interface MachineConfig<TEvent extends { type: string }> {
|
||||
>MachineConfig : Symbol(MachineConfig, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 2, 68))
|
||||
>TEvent : Symbol(TEvent, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 4, 24))
|
||||
>type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 4, 40))
|
||||
|
||||
schema: {
|
||||
>schema : Symbol(MachineConfig.schema, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 4, 58))
|
||||
|
||||
events: TEvent;
|
||||
>events : Symbol(events, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 5, 11))
|
||||
>TEvent : Symbol(TEvent, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 4, 24))
|
||||
|
||||
};
|
||||
on?: {
|
||||
>on : Symbol(MachineConfig.on, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 7, 4))
|
||||
|
||||
[K in TEvent["type"]]?: Action<TEvent extends { type: K } ? TEvent : never>;
|
||||
>K : Symbol(K, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 9, 5))
|
||||
>TEvent : Symbol(TEvent, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 4, 24))
|
||||
>Action : Symbol(Action, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 0, 0))
|
||||
>TEvent : Symbol(TEvent, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 4, 24))
|
||||
>type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 9, 51))
|
||||
>K : Symbol(K, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 9, 5))
|
||||
>TEvent : Symbol(TEvent, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 4, 24))
|
||||
|
||||
} & {
|
||||
"*"?: Action<TEvent>;
|
||||
>"*" : Symbol("*", Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 10, 7))
|
||||
>Action : Symbol(Action, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 0, 0))
|
||||
>TEvent : Symbol(TEvent, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 4, 24))
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
declare function createMachine<TEvent extends { type: string }>(
|
||||
>createMachine : Symbol(createMachine, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 13, 1))
|
||||
>TEvent : Symbol(TEvent, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 15, 31))
|
||||
>type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 15, 47))
|
||||
|
||||
config: MachineConfig<TEvent>
|
||||
>config : Symbol(config, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 15, 64))
|
||||
>MachineConfig : Symbol(MachineConfig, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 2, 68))
|
||||
>TEvent : Symbol(TEvent, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 15, 31))
|
||||
|
||||
): void;
|
||||
|
||||
createMachine({
|
||||
>createMachine : Symbol(createMachine, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 13, 1))
|
||||
|
||||
schema: {
|
||||
>schema : Symbol(schema, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 19, 15))
|
||||
|
||||
events: {} as { type: "FOO" } | { type: "BAR" },
|
||||
>events : Symbol(events, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 20, 11))
|
||||
>type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 21, 19))
|
||||
>type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 21, 37))
|
||||
|
||||
},
|
||||
on: {
|
||||
>on : Symbol(on, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 22, 4))
|
||||
|
||||
FOO: (ev) => {
|
||||
>FOO : Symbol(FOO, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 23, 7))
|
||||
>ev : Symbol(ev, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 24, 10))
|
||||
|
||||
ev.type; // should be 'FOO'
|
||||
>ev.type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 21, 19))
|
||||
>ev : Symbol(ev, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 24, 10))
|
||||
>type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 21, 19))
|
||||
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
createMachine({
|
||||
>createMachine : Symbol(createMachine, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 13, 1))
|
||||
|
||||
schema: {
|
||||
>schema : Symbol(schema, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 30, 15))
|
||||
|
||||
events: {} as { type: "FOO" } | { type: "BAR" },
|
||||
>events : Symbol(events, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 31, 11))
|
||||
>type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 32, 19))
|
||||
>type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 32, 37))
|
||||
|
||||
},
|
||||
on: {
|
||||
>on : Symbol(on, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 33, 4))
|
||||
|
||||
"*": (ev) => {
|
||||
>"*" : Symbol("*", Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 34, 7))
|
||||
>ev : Symbol(ev, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 35, 10))
|
||||
|
||||
ev.type; // should be 'FOO' | 'BAR'
|
||||
>ev.type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 32, 19), Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 32, 37))
|
||||
>ev : Symbol(ev, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 35, 10))
|
||||
>type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 32, 19), Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 32, 37))
|
||||
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
interface MachineConfig2<TEvent extends { type: string }> {
|
||||
>MachineConfig2 : Symbol(MachineConfig2, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 39, 3))
|
||||
>TEvent : Symbol(TEvent, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 41, 25))
|
||||
>type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 41, 41))
|
||||
|
||||
schema: {
|
||||
>schema : Symbol(MachineConfig2.schema, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 41, 59))
|
||||
|
||||
events: TEvent;
|
||||
>events : Symbol(events, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 42, 11))
|
||||
>TEvent : Symbol(TEvent, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 41, 25))
|
||||
|
||||
};
|
||||
on?: {
|
||||
>on : Symbol(MachineConfig2.on, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 44, 4))
|
||||
|
||||
[K in TEvent["type"] as K extends Uppercase<string> ? K : never]?: Action<TEvent extends { type: K } ? TEvent : never>;
|
||||
>K : Symbol(K, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 46, 5))
|
||||
>TEvent : Symbol(TEvent, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 41, 25))
|
||||
>K : Symbol(K, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 46, 5))
|
||||
>Uppercase : Symbol(Uppercase, Decl(lib.es5.d.ts, --, --))
|
||||
>K : Symbol(K, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 46, 5))
|
||||
>Action : Symbol(Action, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 0, 0))
|
||||
>TEvent : Symbol(TEvent, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 41, 25))
|
||||
>type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 46, 94))
|
||||
>K : Symbol(K, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 46, 5))
|
||||
>TEvent : Symbol(TEvent, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 41, 25))
|
||||
|
||||
} & {
|
||||
"*"?: Action<TEvent>;
|
||||
>"*" : Symbol("*", Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 47, 7))
|
||||
>Action : Symbol(Action, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 0, 0))
|
||||
>TEvent : Symbol(TEvent, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 41, 25))
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
declare function createMachine2<TEvent extends { type: string }>(
|
||||
>createMachine2 : Symbol(createMachine2, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 50, 1))
|
||||
>TEvent : Symbol(TEvent, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 52, 32))
|
||||
>type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 52, 48))
|
||||
|
||||
config: MachineConfig2<TEvent>
|
||||
>config : Symbol(config, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 52, 65))
|
||||
>MachineConfig2 : Symbol(MachineConfig2, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 39, 3))
|
||||
>TEvent : Symbol(TEvent, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 52, 32))
|
||||
|
||||
): void;
|
||||
|
||||
createMachine2({
|
||||
>createMachine2 : Symbol(createMachine2, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 50, 1))
|
||||
|
||||
schema: {
|
||||
>schema : Symbol(schema, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 56, 16))
|
||||
|
||||
events: {} as { type: "FOO" } | { type: "bar" },
|
||||
>events : Symbol(events, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 57, 11))
|
||||
>type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 58, 19))
|
||||
>type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 58, 37))
|
||||
|
||||
},
|
||||
on: {
|
||||
>on : Symbol(on, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 59, 4))
|
||||
|
||||
FOO: (ev) => {
|
||||
>FOO : Symbol(FOO, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 60, 7))
|
||||
>ev : Symbol(ev, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 61, 10))
|
||||
|
||||
ev.type; // should be 'FOO'
|
||||
>ev.type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 58, 19))
|
||||
>ev : Symbol(ev, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 61, 10))
|
||||
>type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 58, 19))
|
||||
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
createMachine2({
|
||||
>createMachine2 : Symbol(createMachine2, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 50, 1))
|
||||
|
||||
schema: {
|
||||
>schema : Symbol(schema, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 67, 16))
|
||||
|
||||
events: {} as { type: "FOO" } | { type: "bar" },
|
||||
>events : Symbol(events, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 68, 11))
|
||||
>type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 69, 19))
|
||||
>type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 69, 37))
|
||||
|
||||
},
|
||||
on: {
|
||||
>on : Symbol(on, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 70, 4))
|
||||
|
||||
"*": (ev) => {
|
||||
>"*" : Symbol("*", Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 71, 7))
|
||||
>ev : Symbol(ev, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 72, 10))
|
||||
|
||||
ev.type; // should be 'FOO' | 'bar'
|
||||
>ev.type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 69, 19), Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 69, 37))
|
||||
>ev : Symbol(ev, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 72, 10))
|
||||
>type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 69, 19), Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 69, 37))
|
||||
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
createMachine2({
|
||||
>createMachine2 : Symbol(createMachine2, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 50, 1))
|
||||
|
||||
schema: {
|
||||
>schema : Symbol(schema, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 78, 16))
|
||||
|
||||
events: {} as { type: "FOO" } | { type: "bar" },
|
||||
>events : Symbol(events, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 79, 11))
|
||||
>type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 80, 19))
|
||||
>type : Symbol(type, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 80, 37))
|
||||
|
||||
},
|
||||
on: {
|
||||
>on : Symbol(on, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 81, 4))
|
||||
|
||||
bar: (ev) => {
|
||||
>bar : Symbol(bar, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 82, 7))
|
||||
>ev : Symbol(ev, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 83, 10))
|
||||
|
||||
ev // any
|
||||
>ev : Symbol(ev, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 83, 10))
|
||||
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
// repro from #49307#issuecomment-1143103607
|
||||
|
||||
declare function createSlice<T>(
|
||||
>createSlice : Symbol(createSlice, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 87, 3), Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 122, 2))
|
||||
>T : Symbol(T, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 91, 29))
|
||||
|
||||
reducers: { [K: string]: (state: string) => void } & {
|
||||
>reducers : Symbol(reducers, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 91, 32))
|
||||
>K : Symbol(K, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 92, 15))
|
||||
>state : Symbol(state, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 92, 28))
|
||||
|
||||
[K in keyof T]: object;
|
||||
>K : Symbol(K, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 93, 5))
|
||||
>T : Symbol(T, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 91, 29))
|
||||
}
|
||||
): void;
|
||||
|
||||
createSlice({
|
||||
>createSlice : Symbol(createSlice, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 87, 3), Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 122, 2))
|
||||
|
||||
f(a) {},
|
||||
>f : Symbol(f, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 97, 13))
|
||||
>a : Symbol(a, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 98, 4))
|
||||
|
||||
});
|
||||
|
||||
// repro from #49307#issuecomment-1196014488
|
||||
|
||||
type Validate<T> = T & { [K in keyof T]: object }
|
||||
>Validate : Symbol(Validate, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 99, 3))
|
||||
>T : Symbol(T, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 103, 14))
|
||||
>T : Symbol(T, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 103, 14))
|
||||
>K : Symbol(K, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 103, 26))
|
||||
>T : Symbol(T, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 103, 14))
|
||||
|
||||
declare function f<S, T extends Record<string, (state: S) => any>>(s: S, x: Validate<T>): void;
|
||||
>f : Symbol(f, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 103, 49))
|
||||
>S : Symbol(S, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 104, 19))
|
||||
>T : Symbol(T, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 104, 21))
|
||||
>Record : Symbol(Record, Decl(lib.es5.d.ts, --, --))
|
||||
>state : Symbol(state, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 104, 48))
|
||||
>S : Symbol(S, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 104, 19))
|
||||
>s : Symbol(s, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 104, 67))
|
||||
>S : Symbol(S, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 104, 19))
|
||||
>x : Symbol(x, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 104, 72))
|
||||
>Validate : Symbol(Validate, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 99, 3))
|
||||
>T : Symbol(T, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 104, 21))
|
||||
|
||||
f(0, {
|
||||
>f : Symbol(f, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 103, 49))
|
||||
|
||||
foo: s => s + 1,
|
||||
>foo : Symbol(foo, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 106, 6))
|
||||
>s : Symbol(s, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 107, 6))
|
||||
>s : Symbol(s, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 107, 6))
|
||||
|
||||
})
|
||||
|
||||
// repro from 49307#issuecomment-1195858950
|
||||
|
||||
type SliceCaseReducers<State> = Record<string, (state: State) => State | void>;
|
||||
>SliceCaseReducers : Symbol(SliceCaseReducers, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 108, 2))
|
||||
>State : Symbol(State, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 112, 23))
|
||||
>Record : Symbol(Record, Decl(lib.es5.d.ts, --, --))
|
||||
>state : Symbol(state, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 112, 48))
|
||||
>State : Symbol(State, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 112, 23))
|
||||
>State : Symbol(State, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 112, 23))
|
||||
|
||||
type ValidateSliceCaseReducers<S, ACR extends SliceCaseReducers<S>> = ACR & {
|
||||
>ValidateSliceCaseReducers : Symbol(ValidateSliceCaseReducers, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 112, 79))
|
||||
>S : Symbol(S, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 114, 31))
|
||||
>ACR : Symbol(ACR, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 114, 33))
|
||||
>SliceCaseReducers : Symbol(SliceCaseReducers, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 108, 2))
|
||||
>S : Symbol(S, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 114, 31))
|
||||
>ACR : Symbol(ACR, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 114, 33))
|
||||
|
||||
[T in keyof ACR]: ACR[T] extends {
|
||||
>T : Symbol(T, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 115, 3))
|
||||
>ACR : Symbol(ACR, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 114, 33))
|
||||
>ACR : Symbol(ACR, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 114, 33))
|
||||
>T : Symbol(T, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 115, 3))
|
||||
|
||||
reducer(s: S, action?: infer A): any;
|
||||
>reducer : Symbol(reducer, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 115, 36))
|
||||
>s : Symbol(s, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 116, 12))
|
||||
>S : Symbol(S, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 114, 31))
|
||||
>action : Symbol(action, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 116, 17))
|
||||
>A : Symbol(A, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 116, 32))
|
||||
}
|
||||
? {
|
||||
prepare(...a: never[]): Omit<A, "type">;
|
||||
>prepare : Symbol(prepare, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 118, 7))
|
||||
>a : Symbol(a, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 119, 16))
|
||||
>Omit : Symbol(Omit, Decl(lib.es5.d.ts, --, --))
|
||||
>A : Symbol(A, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 116, 32))
|
||||
}
|
||||
: {};
|
||||
};
|
||||
|
||||
declare function createSlice<
|
||||
>createSlice : Symbol(createSlice, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 87, 3), Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 122, 2))
|
||||
|
||||
State,
|
||||
>State : Symbol(State, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 124, 29))
|
||||
|
||||
CaseReducers extends SliceCaseReducers<State>
|
||||
>CaseReducers : Symbol(CaseReducers, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 125, 8))
|
||||
>SliceCaseReducers : Symbol(SliceCaseReducers, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 108, 2))
|
||||
>State : Symbol(State, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 124, 29))
|
||||
|
||||
>(options: {
|
||||
>options : Symbol(options, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 127, 2))
|
||||
|
||||
initialState: State | (() => State);
|
||||
>initialState : Symbol(initialState, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 127, 12))
|
||||
>State : Symbol(State, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 124, 29))
|
||||
>State : Symbol(State, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 124, 29))
|
||||
|
||||
reducers: ValidateSliceCaseReducers<State, CaseReducers>;
|
||||
>reducers : Symbol(reducers, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 128, 38))
|
||||
>ValidateSliceCaseReducers : Symbol(ValidateSliceCaseReducers, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 112, 79))
|
||||
>State : Symbol(State, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 124, 29))
|
||||
>CaseReducers : Symbol(CaseReducers, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 125, 8))
|
||||
|
||||
}): void;
|
||||
|
||||
export const clientSlice = createSlice({
|
||||
>clientSlice : Symbol(clientSlice, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 132, 12))
|
||||
>createSlice : Symbol(createSlice, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 87, 3), Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 122, 2))
|
||||
|
||||
initialState: {
|
||||
>initialState : Symbol(initialState, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 132, 40))
|
||||
|
||||
username: "",
|
||||
>username : Symbol(username, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 133, 17))
|
||||
|
||||
isLoggedIn: false,
|
||||
>isLoggedIn : Symbol(isLoggedIn, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 134, 17))
|
||||
|
||||
userId: "",
|
||||
>userId : Symbol(userId, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 135, 22))
|
||||
|
||||
avatar: "",
|
||||
>avatar : Symbol(avatar, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 136, 15))
|
||||
|
||||
},
|
||||
reducers: {
|
||||
>reducers : Symbol(reducers, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 138, 4))
|
||||
|
||||
onClientUserChanged(state) {},
|
||||
>onClientUserChanged : Symbol(onClientUserChanged, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 139, 13))
|
||||
>state : Symbol(state, Decl(contextualTypeFunctionObjectPropertyIntersection.ts, 140, 24))
|
||||
|
||||
},
|
||||
});
|
||||
|
||||
|
|
@ -0,0 +1,540 @@
|
|||
//// [tests/cases/compiler/contextualTypeFunctionObjectPropertyIntersection.ts] ////
|
||||
|
||||
=== contextualTypeFunctionObjectPropertyIntersection.ts ===
|
||||
// repro from #48812
|
||||
|
||||
type Action<TEvent extends { type: string }> = (ev: TEvent) => void;
|
||||
>Action : Action<TEvent>
|
||||
> : ^^^^^^^^^^^^^^
|
||||
>type : string
|
||||
> : ^^^^^^
|
||||
>ev : TEvent
|
||||
> : ^^^^^^
|
||||
|
||||
interface MachineConfig<TEvent extends { type: string }> {
|
||||
>type : string
|
||||
> : ^^^^^^
|
||||
|
||||
schema: {
|
||||
>schema : { events: TEvent; }
|
||||
> : ^^^^^^^^^^ ^^^
|
||||
|
||||
events: TEvent;
|
||||
>events : TEvent
|
||||
> : ^^^^^^
|
||||
|
||||
};
|
||||
on?: {
|
||||
>on : ({ [K in TEvent["type"]]?: Action<TEvent extends { type: K; } ? TEvent : never> | undefined; } & { "*"?: Action<TEvent>; }) | undefined
|
||||
> : ^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^
|
||||
|
||||
[K in TEvent["type"]]?: Action<TEvent extends { type: K } ? TEvent : never>;
|
||||
>type : K
|
||||
> : ^
|
||||
|
||||
} & {
|
||||
"*"?: Action<TEvent>;
|
||||
>"*" : Action<TEvent> | undefined
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
declare function createMachine<TEvent extends { type: string }>(
|
||||
>createMachine : <TEvent extends { type: string; }>(config: MachineConfig<TEvent>) => void
|
||||
> : ^ ^^^^^^^^^ ^^ ^^ ^^^^^
|
||||
>type : string
|
||||
> : ^^^^^^
|
||||
|
||||
config: MachineConfig<TEvent>
|
||||
>config : MachineConfig<TEvent>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
): void;
|
||||
|
||||
createMachine({
|
||||
>createMachine({ schema: { events: {} as { type: "FOO" } | { type: "BAR" }, }, on: { FOO: (ev) => { ev.type; // should be 'FOO' }, },}) : void
|
||||
> : ^^^^
|
||||
>createMachine : <TEvent extends { type: string; }>(config: MachineConfig<TEvent>) => void
|
||||
> : ^ ^^^^^^^^^ ^^ ^^ ^^^^^
|
||||
>{ schema: { events: {} as { type: "FOO" } | { type: "BAR" }, }, on: { FOO: (ev) => { ev.type; // should be 'FOO' }, },} : { schema: { events: { type: "FOO"; } | { type: "BAR"; }; }; on: { FOO: (ev: { type: "FOO"; }) => void; }; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
schema: {
|
||||
>schema : { events: { type: "FOO"; } | { type: "BAR"; }; }
|
||||
> : ^^^^^^^^^^ ^^^
|
||||
>{ events: {} as { type: "FOO" } | { type: "BAR" }, } : { events: { type: "FOO"; } | { type: "BAR"; }; }
|
||||
> : ^^^^^^^^^^ ^^^
|
||||
|
||||
events: {} as { type: "FOO" } | { type: "BAR" },
|
||||
>events : { type: "FOO"; } | { type: "BAR"; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
|
||||
>{} as { type: "FOO" } | { type: "BAR" } : { type: "FOO"; } | { type: "BAR"; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
|
||||
>{} : {}
|
||||
> : ^^
|
||||
>type : "FOO"
|
||||
> : ^^^^^
|
||||
>type : "BAR"
|
||||
> : ^^^^^
|
||||
|
||||
},
|
||||
on: {
|
||||
>on : { FOO: (ev: { type: "FOO"; }) => void; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^^
|
||||
>{ FOO: (ev) => { ev.type; // should be 'FOO' }, } : { FOO: (ev: { type: "FOO"; }) => void; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^^
|
||||
|
||||
FOO: (ev) => {
|
||||
>FOO : (ev: { type: "FOO"; }) => void
|
||||
> : ^ ^^^^^^^^^^ ^^^^^^^^^^^^
|
||||
>(ev) => { ev.type; // should be 'FOO' } : (ev: { type: "FOO"; }) => void
|
||||
> : ^ ^^^^^^^^^^ ^^^^^^^^^^^^
|
||||
>ev : { type: "FOO"; }
|
||||
> : ^^^^^^^^ ^^^
|
||||
|
||||
ev.type; // should be 'FOO'
|
||||
>ev.type : "FOO"
|
||||
> : ^^^^^
|
||||
>ev : { type: "FOO"; }
|
||||
> : ^^^^^^^^ ^^^
|
||||
>type : "FOO"
|
||||
> : ^^^^^
|
||||
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
createMachine({
|
||||
>createMachine({ schema: { events: {} as { type: "FOO" } | { type: "BAR" }, }, on: { "*": (ev) => { ev.type; // should be 'FOO' | 'BAR' }, },}) : void
|
||||
> : ^^^^
|
||||
>createMachine : <TEvent extends { type: string; }>(config: MachineConfig<TEvent>) => void
|
||||
> : ^ ^^^^^^^^^ ^^ ^^ ^^^^^
|
||||
>{ schema: { events: {} as { type: "FOO" } | { type: "BAR" }, }, on: { "*": (ev) => { ev.type; // should be 'FOO' | 'BAR' }, },} : { schema: { events: { type: "FOO"; } | { type: "BAR"; }; }; on: { "*": (ev: { type: "FOO"; } | { type: "BAR"; }) => void; }; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
schema: {
|
||||
>schema : { events: { type: "FOO"; } | { type: "BAR"; }; }
|
||||
> : ^^^^^^^^^^ ^^^
|
||||
>{ events: {} as { type: "FOO" } | { type: "BAR" }, } : { events: { type: "FOO"; } | { type: "BAR"; }; }
|
||||
> : ^^^^^^^^^^ ^^^
|
||||
|
||||
events: {} as { type: "FOO" } | { type: "BAR" },
|
||||
>events : { type: "FOO"; } | { type: "BAR"; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
|
||||
>{} as { type: "FOO" } | { type: "BAR" } : { type: "FOO"; } | { type: "BAR"; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
|
||||
>{} : {}
|
||||
> : ^^
|
||||
>type : "FOO"
|
||||
> : ^^^^^
|
||||
>type : "BAR"
|
||||
> : ^^^^^
|
||||
|
||||
},
|
||||
on: {
|
||||
>on : { "*": (ev: { type: "FOO"; } | { type: "BAR"; }) => void; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
|
||||
>{ "*": (ev) => { ev.type; // should be 'FOO' | 'BAR' }, } : { "*": (ev: { type: "FOO"; } | { type: "BAR"; }) => void; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
|
||||
|
||||
"*": (ev) => {
|
||||
>"*" : (ev: { type: "FOO"; } | { type: "BAR"; }) => void
|
||||
> : ^ ^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^
|
||||
>(ev) => { ev.type; // should be 'FOO' | 'BAR' } : (ev: { type: "FOO"; } | { type: "BAR"; }) => void
|
||||
> : ^ ^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^
|
||||
>ev : { type: "FOO"; } | { type: "BAR"; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
|
||||
|
||||
ev.type; // should be 'FOO' | 'BAR'
|
||||
>ev.type : "FOO" | "BAR"
|
||||
> : ^^^^^^^^^^^^^
|
||||
>ev : { type: "FOO"; } | { type: "BAR"; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
|
||||
>type : "FOO" | "BAR"
|
||||
> : ^^^^^^^^^^^^^
|
||||
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
interface MachineConfig2<TEvent extends { type: string }> {
|
||||
>type : string
|
||||
> : ^^^^^^
|
||||
|
||||
schema: {
|
||||
>schema : { events: TEvent; }
|
||||
> : ^^^^^^^^^^ ^^^
|
||||
|
||||
events: TEvent;
|
||||
>events : TEvent
|
||||
> : ^^^^^^
|
||||
|
||||
};
|
||||
on?: {
|
||||
>on : ({ [K in TEvent["type"] as K extends Uppercase<string> ? K : never]?: Action<TEvent extends { type: K; } ? TEvent : never> | undefined; } & { "*"?: Action<TEvent>; }) | undefined
|
||||
> : ^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^
|
||||
|
||||
[K in TEvent["type"] as K extends Uppercase<string> ? K : never]?: Action<TEvent extends { type: K } ? TEvent : never>;
|
||||
>type : K
|
||||
> : ^
|
||||
|
||||
} & {
|
||||
"*"?: Action<TEvent>;
|
||||
>"*" : Action<TEvent> | undefined
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
declare function createMachine2<TEvent extends { type: string }>(
|
||||
>createMachine2 : <TEvent extends { type: string; }>(config: MachineConfig2<TEvent>) => void
|
||||
> : ^ ^^^^^^^^^ ^^ ^^ ^^^^^
|
||||
>type : string
|
||||
> : ^^^^^^
|
||||
|
||||
config: MachineConfig2<TEvent>
|
||||
>config : MachineConfig2<TEvent>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
): void;
|
||||
|
||||
createMachine2({
|
||||
>createMachine2({ schema: { events: {} as { type: "FOO" } | { type: "bar" }, }, on: { FOO: (ev) => { ev.type; // should be 'FOO' }, },}) : void
|
||||
> : ^^^^
|
||||
>createMachine2 : <TEvent extends { type: string; }>(config: MachineConfig2<TEvent>) => void
|
||||
> : ^ ^^^^^^^^^ ^^ ^^ ^^^^^
|
||||
>{ schema: { events: {} as { type: "FOO" } | { type: "bar" }, }, on: { FOO: (ev) => { ev.type; // should be 'FOO' }, },} : { schema: { events: { type: "FOO"; } | { type: "bar"; }; }; on: { FOO: (ev: { type: "FOO"; }) => void; }; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
schema: {
|
||||
>schema : { events: { type: "FOO"; } | { type: "bar"; }; }
|
||||
> : ^^^^^^^^^^ ^^^
|
||||
>{ events: {} as { type: "FOO" } | { type: "bar" }, } : { events: { type: "FOO"; } | { type: "bar"; }; }
|
||||
> : ^^^^^^^^^^ ^^^
|
||||
|
||||
events: {} as { type: "FOO" } | { type: "bar" },
|
||||
>events : { type: "FOO"; } | { type: "bar"; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
|
||||
>{} as { type: "FOO" } | { type: "bar" } : { type: "FOO"; } | { type: "bar"; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
|
||||
>{} : {}
|
||||
> : ^^
|
||||
>type : "FOO"
|
||||
> : ^^^^^
|
||||
>type : "bar"
|
||||
> : ^^^^^
|
||||
|
||||
},
|
||||
on: {
|
||||
>on : { FOO: (ev: { type: "FOO"; }) => void; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^^
|
||||
>{ FOO: (ev) => { ev.type; // should be 'FOO' }, } : { FOO: (ev: { type: "FOO"; }) => void; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^^
|
||||
|
||||
FOO: (ev) => {
|
||||
>FOO : (ev: { type: "FOO"; }) => void
|
||||
> : ^ ^^^^^^^^^^ ^^^^^^^^^^^^
|
||||
>(ev) => { ev.type; // should be 'FOO' } : (ev: { type: "FOO"; }) => void
|
||||
> : ^ ^^^^^^^^^^ ^^^^^^^^^^^^
|
||||
>ev : { type: "FOO"; }
|
||||
> : ^^^^^^^^ ^^^
|
||||
|
||||
ev.type; // should be 'FOO'
|
||||
>ev.type : "FOO"
|
||||
> : ^^^^^
|
||||
>ev : { type: "FOO"; }
|
||||
> : ^^^^^^^^ ^^^
|
||||
>type : "FOO"
|
||||
> : ^^^^^
|
||||
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
createMachine2({
|
||||
>createMachine2({ schema: { events: {} as { type: "FOO" } | { type: "bar" }, }, on: { "*": (ev) => { ev.type; // should be 'FOO' | 'bar' }, },}) : void
|
||||
> : ^^^^
|
||||
>createMachine2 : <TEvent extends { type: string; }>(config: MachineConfig2<TEvent>) => void
|
||||
> : ^ ^^^^^^^^^ ^^ ^^ ^^^^^
|
||||
>{ schema: { events: {} as { type: "FOO" } | { type: "bar" }, }, on: { "*": (ev) => { ev.type; // should be 'FOO' | 'bar' }, },} : { schema: { events: { type: "FOO"; } | { type: "bar"; }; }; on: { "*": (ev: { type: "FOO"; } | { type: "bar"; }) => void; }; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
schema: {
|
||||
>schema : { events: { type: "FOO"; } | { type: "bar"; }; }
|
||||
> : ^^^^^^^^^^ ^^^
|
||||
>{ events: {} as { type: "FOO" } | { type: "bar" }, } : { events: { type: "FOO"; } | { type: "bar"; }; }
|
||||
> : ^^^^^^^^^^ ^^^
|
||||
|
||||
events: {} as { type: "FOO" } | { type: "bar" },
|
||||
>events : { type: "FOO"; } | { type: "bar"; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
|
||||
>{} as { type: "FOO" } | { type: "bar" } : { type: "FOO"; } | { type: "bar"; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
|
||||
>{} : {}
|
||||
> : ^^
|
||||
>type : "FOO"
|
||||
> : ^^^^^
|
||||
>type : "bar"
|
||||
> : ^^^^^
|
||||
|
||||
},
|
||||
on: {
|
||||
>on : { "*": (ev: { type: "FOO"; } | { type: "bar"; }) => void; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
|
||||
>{ "*": (ev) => { ev.type; // should be 'FOO' | 'bar' }, } : { "*": (ev: { type: "FOO"; } | { type: "bar"; }) => void; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
|
||||
|
||||
"*": (ev) => {
|
||||
>"*" : (ev: { type: "FOO"; } | { type: "bar"; }) => void
|
||||
> : ^ ^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^
|
||||
>(ev) => { ev.type; // should be 'FOO' | 'bar' } : (ev: { type: "FOO"; } | { type: "bar"; }) => void
|
||||
> : ^ ^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^
|
||||
>ev : { type: "FOO"; } | { type: "bar"; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
|
||||
|
||||
ev.type; // should be 'FOO' | 'bar'
|
||||
>ev.type : "FOO" | "bar"
|
||||
> : ^^^^^^^^^^^^^
|
||||
>ev : { type: "FOO"; } | { type: "bar"; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
|
||||
>type : "FOO" | "bar"
|
||||
> : ^^^^^^^^^^^^^
|
||||
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
createMachine2({
|
||||
>createMachine2({ schema: { events: {} as { type: "FOO" } | { type: "bar" }, }, on: { bar: (ev) => { ev // any }, },}) : void
|
||||
> : ^^^^
|
||||
>createMachine2 : <TEvent extends { type: string; }>(config: MachineConfig2<TEvent>) => void
|
||||
> : ^ ^^^^^^^^^ ^^ ^^ ^^^^^
|
||||
>{ schema: { events: {} as { type: "FOO" } | { type: "bar" }, }, on: { bar: (ev) => { ev // any }, },} : { schema: { events: { type: "FOO"; } | { type: "bar"; }; }; on: { bar: (ev: any) => void; }; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
schema: {
|
||||
>schema : { events: { type: "FOO"; } | { type: "bar"; }; }
|
||||
> : ^^^^^^^^^^ ^^^
|
||||
>{ events: {} as { type: "FOO" } | { type: "bar" }, } : { events: { type: "FOO"; } | { type: "bar"; }; }
|
||||
> : ^^^^^^^^^^ ^^^
|
||||
|
||||
events: {} as { type: "FOO" } | { type: "bar" },
|
||||
>events : { type: "FOO"; } | { type: "bar"; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
|
||||
>{} as { type: "FOO" } | { type: "bar" } : { type: "FOO"; } | { type: "bar"; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^^^^^ ^^^
|
||||
>{} : {}
|
||||
> : ^^
|
||||
>type : "FOO"
|
||||
> : ^^^^^
|
||||
>type : "bar"
|
||||
> : ^^^^^
|
||||
|
||||
},
|
||||
on: {
|
||||
>on : { bar: (ev: any) => void; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^^^^^^^^
|
||||
>{ bar: (ev) => { ev // any }, } : { bar: (ev: any) => void; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^^^^^^^^
|
||||
|
||||
bar: (ev) => {
|
||||
>bar : (ev: any) => void
|
||||
> : ^ ^^^^^^^^^^^^^^
|
||||
>(ev) => { ev // any } : (ev: any) => void
|
||||
> : ^ ^^^^^^^^^^^^^^
|
||||
>ev : any
|
||||
> : ^^^
|
||||
|
||||
ev // any
|
||||
>ev : any
|
||||
> : ^^^
|
||||
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
// repro from #49307#issuecomment-1143103607
|
||||
|
||||
declare function createSlice<T>(
|
||||
>createSlice : { <T>(reducers: { [K: string]: (state: string) => void; } & { [K in keyof T]: object; }): void; <State, CaseReducers extends SliceCaseReducers<State>>(options: { initialState: State | (() => State); reducers: ValidateSliceCaseReducers<State, CaseReducers>; }): void; }
|
||||
> : ^^^ ^^ ^^ ^^^ ^^^ ^^ ^^^^^^^^^ ^^ ^^ ^^^ ^^^
|
||||
|
||||
reducers: { [K: string]: (state: string) => void } & {
|
||||
>reducers : { [K: string]: (state: string) => void; } & { [K in keyof T]: object; }
|
||||
> : ^^^^^^^^^^^^^^^^ ^^ ^^^^^ ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>K : string
|
||||
> : ^^^^^^
|
||||
>state : string
|
||||
> : ^^^^^^
|
||||
|
||||
[K in keyof T]: object;
|
||||
}
|
||||
): void;
|
||||
|
||||
createSlice({
|
||||
>createSlice({ f(a) {},}) : void
|
||||
> : ^^^^
|
||||
>createSlice : { <T>(reducers: { [K: string]: (state: string) => void; } & { [K in keyof T]: object; }): void; <State, CaseReducers extends SliceCaseReducers<State>>(options: { initialState: State | (() => State); reducers: ValidateSliceCaseReducers<State, CaseReducers>; }): void; }
|
||||
> : ^^^ ^^ ^^ ^^^ ^^^ ^^ ^^^^^^^^^ ^^ ^^ ^^^ ^^^
|
||||
>{ f(a) {},} : { f(a: string): void; }
|
||||
> : ^^^^ ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
f(a) {},
|
||||
>f : (a: string) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^
|
||||
>a : string
|
||||
> : ^^^^^^
|
||||
|
||||
});
|
||||
|
||||
// repro from #49307#issuecomment-1196014488
|
||||
|
||||
type Validate<T> = T & { [K in keyof T]: object }
|
||||
>Validate : Validate<T>
|
||||
> : ^^^^^^^^^^^
|
||||
|
||||
declare function f<S, T extends Record<string, (state: S) => any>>(s: S, x: Validate<T>): void;
|
||||
>f : <S, T extends Record<string, (state: S) => any>>(s: S, x: Validate<T>) => void
|
||||
> : ^ ^^ ^^^^^^^^^ ^^ ^^ ^^ ^^ ^^^^^
|
||||
>state : S
|
||||
> : ^
|
||||
>s : S
|
||||
> : ^
|
||||
>x : Validate<T>
|
||||
> : ^^^^^^^^^^^
|
||||
|
||||
f(0, {
|
||||
>f(0, { foo: s => s + 1,}) : void
|
||||
> : ^^^^
|
||||
>f : <S, T extends Record<string, (state: S) => any>>(s: S, x: Validate<T>) => void
|
||||
> : ^ ^^ ^^^^^^^^^ ^^ ^^ ^^ ^^ ^^^^^
|
||||
>0 : 0
|
||||
> : ^
|
||||
>{ foo: s => s + 1,} : { foo: (s: number) => number; }
|
||||
> : ^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
foo: s => s + 1,
|
||||
>foo : (s: number) => number
|
||||
> : ^ ^^^^^^^^^^^^^^^^^^^
|
||||
>s => s + 1 : (s: number) => number
|
||||
> : ^ ^^^^^^^^^^^^^^^^^^^
|
||||
>s : number
|
||||
> : ^^^^^^
|
||||
>s + 1 : number
|
||||
> : ^^^^^^
|
||||
>s : number
|
||||
> : ^^^^^^
|
||||
>1 : 1
|
||||
> : ^
|
||||
|
||||
})
|
||||
|
||||
// repro from 49307#issuecomment-1195858950
|
||||
|
||||
type SliceCaseReducers<State> = Record<string, (state: State) => State | void>;
|
||||
>SliceCaseReducers : SliceCaseReducers<State>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>state : State
|
||||
> : ^^^^^
|
||||
|
||||
type ValidateSliceCaseReducers<S, ACR extends SliceCaseReducers<S>> = ACR & {
|
||||
>ValidateSliceCaseReducers : ValidateSliceCaseReducers<S, ACR>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
[T in keyof ACR]: ACR[T] extends {
|
||||
reducer(s: S, action?: infer A): any;
|
||||
>reducer : (s: S, action?: infer A) => any
|
||||
> : ^ ^^ ^^ ^^^ ^^^^^
|
||||
>s : S
|
||||
> : ^
|
||||
>action : A | undefined
|
||||
> : ^^^^^^^^^^^^^
|
||||
}
|
||||
? {
|
||||
prepare(...a: never[]): Omit<A, "type">;
|
||||
>prepare : (...a: never[]) => Omit<A, "type">
|
||||
> : ^^^^ ^^ ^^^^^
|
||||
>a : never[]
|
||||
> : ^^^^^^^
|
||||
}
|
||||
: {};
|
||||
};
|
||||
|
||||
declare function createSlice<
|
||||
>createSlice : { <T>(reducers: { [K: string]: (state: string) => void; } & { [K in keyof T]: object; }): void; <State, CaseReducers extends SliceCaseReducers<State>>(options: { initialState: State | (() => State); reducers: ValidateSliceCaseReducers<State, CaseReducers>; }): void; }
|
||||
> : ^^^ ^^ ^^ ^^^ ^^^ ^^ ^^^^^^^^^ ^^ ^^ ^^^ ^^^
|
||||
|
||||
State,
|
||||
CaseReducers extends SliceCaseReducers<State>
|
||||
>(options: {
|
||||
>options : { initialState: State | (() => State); reducers: ValidateSliceCaseReducers<State, CaseReducers>; }
|
||||
> : ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^ ^^^
|
||||
|
||||
initialState: State | (() => State);
|
||||
>initialState : State | (() => State)
|
||||
> : ^^^^^^^^^^^^^^^ ^
|
||||
|
||||
reducers: ValidateSliceCaseReducers<State, CaseReducers>;
|
||||
>reducers : ValidateSliceCaseReducers<State, CaseReducers>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
}): void;
|
||||
|
||||
export const clientSlice = createSlice({
|
||||
>clientSlice : void
|
||||
> : ^^^^
|
||||
>createSlice({ initialState: { username: "", isLoggedIn: false, userId: "", avatar: "", }, reducers: { onClientUserChanged(state) {}, },}) : void
|
||||
> : ^^^^
|
||||
>createSlice : { <T>(reducers: { [K: string]: (state: string) => void; } & { [K in keyof T]: object; }): void; <State, CaseReducers extends SliceCaseReducers<State>>(options: { initialState: State | (() => State); reducers: ValidateSliceCaseReducers<State, CaseReducers>; }): void; }
|
||||
> : ^^^ ^^ ^^ ^^^ ^^^ ^^ ^^^^^^^^^ ^^ ^^ ^^^ ^^^
|
||||
>{ initialState: { username: "", isLoggedIn: false, userId: "", avatar: "", }, reducers: { onClientUserChanged(state) {}, },} : { initialState: { username: string; isLoggedIn: false; userId: string; avatar: string; }; reducers: { onClientUserChanged(state: { username: string; isLoggedIn: boolean; userId: string; avatar: string; }): void; }; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
initialState: {
|
||||
>initialState : { username: string; isLoggedIn: false; userId: string; avatar: string; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>{ username: "", isLoggedIn: false, userId: "", avatar: "", } : { username: string; isLoggedIn: false; userId: string; avatar: string; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
username: "",
|
||||
>username : string
|
||||
> : ^^^^^^
|
||||
>"" : ""
|
||||
> : ^^
|
||||
|
||||
isLoggedIn: false,
|
||||
>isLoggedIn : false
|
||||
> : ^^^^^
|
||||
>false : false
|
||||
> : ^^^^^
|
||||
|
||||
userId: "",
|
||||
>userId : string
|
||||
> : ^^^^^^
|
||||
>"" : ""
|
||||
> : ^^
|
||||
|
||||
avatar: "",
|
||||
>avatar : string
|
||||
> : ^^^^^^
|
||||
>"" : ""
|
||||
> : ^^
|
||||
|
||||
},
|
||||
reducers: {
|
||||
>reducers : { onClientUserChanged(state: { username: string; isLoggedIn: boolean; userId: string; avatar: string; }): void; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>{ onClientUserChanged(state) {}, } : { onClientUserChanged(state: { username: string; isLoggedIn: boolean; userId: string; avatar: string; }): void; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
onClientUserChanged(state) {},
|
||||
>onClientUserChanged : (state: { username: string; isLoggedIn: boolean; userId: string; avatar: string; }) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>state : { username: string; isLoggedIn: boolean; userId: string; avatar: string; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
},
|
||||
});
|
||||
|
||||
|
|
@ -0,0 +1,117 @@
|
|||
//// [tests/cases/compiler/contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts] ////
|
||||
|
||||
=== contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts ===
|
||||
type IntrinsicElements = {
|
||||
>IntrinsicElements : Symbol(IntrinsicElements, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 0, 0))
|
||||
|
||||
div: {
|
||||
>div : Symbol(div, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 0, 26))
|
||||
|
||||
onChange: (ev: Event) => void;
|
||||
>onChange : Symbol(onChange, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 1, 8))
|
||||
>ev : Symbol(ev, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 2, 15))
|
||||
>Event : Symbol(Event, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --))
|
||||
|
||||
};
|
||||
span: {
|
||||
>span : Symbol(span, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 3, 4))
|
||||
|
||||
onChange: (ev: Event) => void;
|
||||
>onChange : Symbol(onChange, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 4, 9))
|
||||
>ev : Symbol(ev, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 5, 15))
|
||||
>Event : Symbol(Event, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --))
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
type ElementType = keyof IntrinsicElements;
|
||||
>ElementType : Symbol(ElementType, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 7, 2))
|
||||
>IntrinsicElements : Symbol(IntrinsicElements, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 0, 0))
|
||||
|
||||
let DEFAULT_TABS_TAG = "div" as const;
|
||||
>DEFAULT_TABS_TAG : Symbol(DEFAULT_TABS_TAG, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 11, 3))
|
||||
>const : Symbol(const)
|
||||
|
||||
type Props<TTag extends ElementType, Overrides = {}> = Omit<
|
||||
>Props : Symbol(Props, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 11, 38))
|
||||
>TTag : Symbol(TTag, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 13, 11))
|
||||
>ElementType : Symbol(ElementType, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 7, 2))
|
||||
>Overrides : Symbol(Overrides, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 13, 36))
|
||||
>Omit : Symbol(Omit, Decl(lib.es5.d.ts, --, --))
|
||||
|
||||
IntrinsicElements[TTag],
|
||||
>IntrinsicElements : Symbol(IntrinsicElements, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 0, 0))
|
||||
>TTag : Symbol(TTag, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 13, 11))
|
||||
|
||||
keyof Overrides
|
||||
>Overrides : Symbol(Overrides, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 13, 36))
|
||||
|
||||
> &
|
||||
Overrides;
|
||||
>Overrides : Symbol(Overrides, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 13, 36))
|
||||
|
||||
type TabGroupProps<TTag extends ElementType = typeof DEFAULT_TABS_TAG> = Props<
|
||||
>TabGroupProps : Symbol(TabGroupProps, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 17, 12))
|
||||
>TTag : Symbol(TTag, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 19, 19))
|
||||
>ElementType : Symbol(ElementType, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 7, 2))
|
||||
>DEFAULT_TABS_TAG : Symbol(DEFAULT_TABS_TAG, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 11, 3))
|
||||
>Props : Symbol(Props, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 11, 38))
|
||||
|
||||
TTag,
|
||||
>TTag : Symbol(TTag, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 19, 19))
|
||||
{
|
||||
defaultIndex?: number;
|
||||
>defaultIndex : Symbol(defaultIndex, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 21, 3))
|
||||
|
||||
onChange?: (index: number) => void;
|
||||
>onChange : Symbol(onChange, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 22, 26))
|
||||
>index : Symbol(index, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 23, 16))
|
||||
|
||||
selectedIndex?: number;
|
||||
>selectedIndex : Symbol(selectedIndex, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 23, 39))
|
||||
|
||||
vertical?: boolean;
|
||||
>vertical : Symbol(vertical, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 24, 27))
|
||||
|
||||
manual?: boolean;
|
||||
>manual : Symbol(manual, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 25, 23))
|
||||
}
|
||||
>;
|
||||
|
||||
interface _internal_ComponentTabGroup {
|
||||
>_internal_ComponentTabGroup : Symbol(_internal_ComponentTabGroup, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 28, 2))
|
||||
|
||||
<TTag extends ElementType = typeof DEFAULT_TABS_TAG>(
|
||||
>TTag : Symbol(TTag, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 31, 3))
|
||||
>ElementType : Symbol(ElementType, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 7, 2))
|
||||
>DEFAULT_TABS_TAG : Symbol(DEFAULT_TABS_TAG, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 11, 3))
|
||||
|
||||
props: TabGroupProps<TTag>,
|
||||
>props : Symbol(props, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 31, 55))
|
||||
>TabGroupProps : Symbol(TabGroupProps, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 17, 12))
|
||||
>TTag : Symbol(TTag, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 31, 3))
|
||||
|
||||
): null;
|
||||
}
|
||||
|
||||
declare let TabGroup: _internal_ComponentTabGroup;
|
||||
>TabGroup : Symbol(TabGroup, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 36, 11))
|
||||
>_internal_ComponentTabGroup : Symbol(_internal_ComponentTabGroup, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 28, 2))
|
||||
|
||||
TabGroup({
|
||||
>TabGroup : Symbol(TabGroup, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 36, 11))
|
||||
|
||||
defaultIndex: 0,
|
||||
>defaultIndex : Symbol(defaultIndex, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 38, 10))
|
||||
|
||||
onChange: (index) => {
|
||||
>onChange : Symbol(onChange, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 39, 18))
|
||||
>index : Symbol(index, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 40, 13))
|
||||
|
||||
const i: number = index;
|
||||
>i : Symbol(i, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 41, 9))
|
||||
>index : Symbol(index, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts, 40, 13))
|
||||
|
||||
},
|
||||
});
|
||||
|
|
@ -0,0 +1,131 @@
|
|||
//// [tests/cases/compiler/contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts] ////
|
||||
|
||||
=== contextualTypesNegatedTypeLikeConstraintInGenericMappedType1.ts ===
|
||||
type IntrinsicElements = {
|
||||
>IntrinsicElements : IntrinsicElements
|
||||
> : ^^^^^^^^^^^^^^^^^
|
||||
|
||||
div: {
|
||||
>div : { onChange: (ev: Event) => void; }
|
||||
> : ^^^^^^^^^^^^ ^^^
|
||||
|
||||
onChange: (ev: Event) => void;
|
||||
>onChange : (ev: Event) => void
|
||||
> : ^ ^^ ^^^^^
|
||||
>ev : Event
|
||||
> : ^^^^^
|
||||
|
||||
};
|
||||
span: {
|
||||
>span : { onChange: (ev: Event) => void; }
|
||||
> : ^^^^^^^^^^^^ ^^^
|
||||
|
||||
onChange: (ev: Event) => void;
|
||||
>onChange : (ev: Event) => void
|
||||
> : ^ ^^ ^^^^^
|
||||
>ev : Event
|
||||
> : ^^^^^
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
type ElementType = keyof IntrinsicElements;
|
||||
>ElementType : keyof IntrinsicElements
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
let DEFAULT_TABS_TAG = "div" as const;
|
||||
>DEFAULT_TABS_TAG : "div"
|
||||
> : ^^^^^
|
||||
>"div" as const : "div"
|
||||
> : ^^^^^
|
||||
>"div" : "div"
|
||||
> : ^^^^^
|
||||
|
||||
type Props<TTag extends ElementType, Overrides = {}> = Omit<
|
||||
>Props : Props<TTag, Overrides>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
IntrinsicElements[TTag],
|
||||
keyof Overrides
|
||||
> &
|
||||
Overrides;
|
||||
|
||||
type TabGroupProps<TTag extends ElementType = typeof DEFAULT_TABS_TAG> = Props<
|
||||
>TabGroupProps : TabGroupProps<TTag>
|
||||
> : ^^^^^^^^^^^^^^^^^^^
|
||||
>DEFAULT_TABS_TAG : "div"
|
||||
> : ^^^^^
|
||||
|
||||
TTag,
|
||||
{
|
||||
defaultIndex?: number;
|
||||
>defaultIndex : number | undefined
|
||||
> : ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
onChange?: (index: number) => void;
|
||||
>onChange : ((index: number) => void) | undefined
|
||||
> : ^^ ^^ ^^^^^ ^^^^^^^^^^^^^
|
||||
>index : number
|
||||
> : ^^^^^^
|
||||
|
||||
selectedIndex?: number;
|
||||
>selectedIndex : number | undefined
|
||||
> : ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
vertical?: boolean;
|
||||
>vertical : boolean | undefined
|
||||
> : ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
manual?: boolean;
|
||||
>manual : boolean | undefined
|
||||
> : ^^^^^^^^^^^^^^^^^^^
|
||||
}
|
||||
>;
|
||||
|
||||
interface _internal_ComponentTabGroup {
|
||||
<TTag extends ElementType = typeof DEFAULT_TABS_TAG>(
|
||||
>DEFAULT_TABS_TAG : "div"
|
||||
> : ^^^^^
|
||||
|
||||
props: TabGroupProps<TTag>,
|
||||
>props : TabGroupProps<TTag>
|
||||
> : ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
): null;
|
||||
}
|
||||
|
||||
declare let TabGroup: _internal_ComponentTabGroup;
|
||||
>TabGroup : _internal_ComponentTabGroup
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
TabGroup({
|
||||
>TabGroup({ defaultIndex: 0, onChange: (index) => { const i: number = index; },}) : null
|
||||
> : ^^^^
|
||||
>TabGroup : _internal_ComponentTabGroup
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>{ defaultIndex: 0, onChange: (index) => { const i: number = index; },} : { defaultIndex: number; onChange: (index: number) => void; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
defaultIndex: 0,
|
||||
>defaultIndex : number
|
||||
> : ^^^^^^
|
||||
>0 : 0
|
||||
> : ^
|
||||
|
||||
onChange: (index) => {
|
||||
>onChange : (index: number) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^
|
||||
>(index) => { const i: number = index; } : (index: number) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^
|
||||
>index : number
|
||||
> : ^^^^^^
|
||||
|
||||
const i: number = index;
|
||||
>i : number
|
||||
> : ^^^^^^
|
||||
>index : number
|
||||
> : ^^^^^^
|
||||
|
||||
},
|
||||
});
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts(24,3): error TS2322: Type '(_: any) => string' is not assignable to type 'never'.
|
||||
contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts(24,7): error TS7006: Parameter '_' implicitly has an 'any' type.
|
||||
|
||||
|
||||
==== contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts (2 errors) ====
|
||||
type Tags<D extends string, P> = P extends Record<D, infer X> ? X : never;
|
||||
|
||||
declare const typeTags: <I>() => <
|
||||
P extends {
|
||||
readonly [Tag in Tags<"_tag", I> & string]: (
|
||||
_: Extract<I, { readonly _tag: Tag }>,
|
||||
) => any;
|
||||
} & { readonly [Tag in Exclude<keyof P, Tags<"_tag", I>>]: never },
|
||||
>(
|
||||
fields: P,
|
||||
) => unknown;
|
||||
|
||||
type Value = { _tag: "A"; a: number } | { _tag: "B"; b: number };
|
||||
const matcher = typeTags<Value>();
|
||||
|
||||
matcher({
|
||||
A: (_) => _.a,
|
||||
B: (_) => "fail",
|
||||
});
|
||||
|
||||
matcher({
|
||||
A: (_) => _.a,
|
||||
B: (_) => "fail",
|
||||
C: (_) => "fail",
|
||||
~
|
||||
!!! error TS2322: Type '(_: any) => string' is not assignable to type 'never'.
|
||||
~
|
||||
!!! error TS7006: Parameter '_' implicitly has an 'any' type.
|
||||
});
|
||||
|
|
@ -0,0 +1,95 @@
|
|||
//// [tests/cases/compiler/contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts] ////
|
||||
|
||||
=== contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts ===
|
||||
type Tags<D extends string, P> = P extends Record<D, infer X> ? X : never;
|
||||
>Tags : Symbol(Tags, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 0, 0))
|
||||
>D : Symbol(D, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 0, 10))
|
||||
>P : Symbol(P, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 0, 27))
|
||||
>P : Symbol(P, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 0, 27))
|
||||
>Record : Symbol(Record, Decl(lib.es5.d.ts, --, --))
|
||||
>D : Symbol(D, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 0, 10))
|
||||
>X : Symbol(X, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 0, 58))
|
||||
>X : Symbol(X, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 0, 58))
|
||||
|
||||
declare const typeTags: <I>() => <
|
||||
>typeTags : Symbol(typeTags, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 2, 13))
|
||||
>I : Symbol(I, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 2, 25))
|
||||
|
||||
P extends {
|
||||
>P : Symbol(P, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 2, 34))
|
||||
|
||||
readonly [Tag in Tags<"_tag", I> & string]: (
|
||||
>Tag : Symbol(Tag, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 4, 14))
|
||||
>Tags : Symbol(Tags, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 0, 0))
|
||||
>I : Symbol(I, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 2, 25))
|
||||
|
||||
_: Extract<I, { readonly _tag: Tag }>,
|
||||
>_ : Symbol(_, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 4, 49))
|
||||
>Extract : Symbol(Extract, Decl(lib.es5.d.ts, --, --))
|
||||
>I : Symbol(I, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 2, 25))
|
||||
>_tag : Symbol(_tag, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 5, 21))
|
||||
>Tag : Symbol(Tag, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 4, 14))
|
||||
|
||||
) => any;
|
||||
} & { readonly [Tag in Exclude<keyof P, Tags<"_tag", I>>]: never },
|
||||
>Tag : Symbol(Tag, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 7, 18))
|
||||
>Exclude : Symbol(Exclude, Decl(lib.es5.d.ts, --, --))
|
||||
>P : Symbol(P, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 2, 34))
|
||||
>Tags : Symbol(Tags, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 0, 0))
|
||||
>I : Symbol(I, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 2, 25))
|
||||
|
||||
>(
|
||||
fields: P,
|
||||
>fields : Symbol(fields, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 8, 2))
|
||||
>P : Symbol(P, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 2, 34))
|
||||
|
||||
) => unknown;
|
||||
|
||||
type Value = { _tag: "A"; a: number } | { _tag: "B"; b: number };
|
||||
>Value : Symbol(Value, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 10, 13))
|
||||
>_tag : Symbol(_tag, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 12, 14))
|
||||
>a : Symbol(a, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 12, 25))
|
||||
>_tag : Symbol(_tag, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 12, 41))
|
||||
>b : Symbol(b, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 12, 52))
|
||||
|
||||
const matcher = typeTags<Value>();
|
||||
>matcher : Symbol(matcher, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 13, 5))
|
||||
>typeTags : Symbol(typeTags, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 2, 13))
|
||||
>Value : Symbol(Value, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 10, 13))
|
||||
|
||||
matcher({
|
||||
>matcher : Symbol(matcher, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 13, 5))
|
||||
|
||||
A: (_) => _.a,
|
||||
>A : Symbol(A, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 15, 9))
|
||||
>_ : Symbol(_, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 16, 6))
|
||||
>_.a : Symbol(a, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 12, 25))
|
||||
>_ : Symbol(_, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 16, 6))
|
||||
>a : Symbol(a, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 12, 25))
|
||||
|
||||
B: (_) => "fail",
|
||||
>B : Symbol(B, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 16, 16))
|
||||
>_ : Symbol(_, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 17, 6))
|
||||
|
||||
});
|
||||
|
||||
matcher({
|
||||
>matcher : Symbol(matcher, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 13, 5))
|
||||
|
||||
A: (_) => _.a,
|
||||
>A : Symbol(A, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 20, 9))
|
||||
>_ : Symbol(_, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 21, 6))
|
||||
>_.a : Symbol(a, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 12, 25))
|
||||
>_ : Symbol(_, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 21, 6))
|
||||
>a : Symbol(a, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 12, 25))
|
||||
|
||||
B: (_) => "fail",
|
||||
>B : Symbol(B, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 21, 16))
|
||||
>_ : Symbol(_, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 22, 6))
|
||||
|
||||
C: (_) => "fail",
|
||||
>C : Symbol(C, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 22, 19))
|
||||
>_ : Symbol(_, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts, 23, 6))
|
||||
|
||||
});
|
||||
|
|
@ -0,0 +1,126 @@
|
|||
//// [tests/cases/compiler/contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts] ////
|
||||
|
||||
=== contextualTypesNegatedTypeLikeConstraintInGenericMappedType2.ts ===
|
||||
type Tags<D extends string, P> = P extends Record<D, infer X> ? X : never;
|
||||
>Tags : Tags<D, P>
|
||||
> : ^^^^^^^^^^
|
||||
|
||||
declare const typeTags: <I>() => <
|
||||
>typeTags : <I>() => <P extends { readonly [Tag in Tags<"_tag", I> & string]: (_: Extract<I, { readonly _tag: Tag; }>) => any; } & { readonly [Tag in Exclude<keyof P, Tags<"_tag", I>>]: never; }>(fields: P) => unknown
|
||||
> : ^ ^^^^^^^
|
||||
|
||||
P extends {
|
||||
readonly [Tag in Tags<"_tag", I> & string]: (
|
||||
_: Extract<I, { readonly _tag: Tag }>,
|
||||
>_ : Extract<I, { readonly _tag: Tag; }>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^
|
||||
>_tag : Tag
|
||||
> : ^^^
|
||||
|
||||
) => any;
|
||||
} & { readonly [Tag in Exclude<keyof P, Tags<"_tag", I>>]: never },
|
||||
>(
|
||||
fields: P,
|
||||
>fields : P
|
||||
> : ^
|
||||
|
||||
) => unknown;
|
||||
|
||||
type Value = { _tag: "A"; a: number } | { _tag: "B"; b: number };
|
||||
>Value : Value
|
||||
> : ^^^^^
|
||||
>_tag : "A"
|
||||
> : ^^^
|
||||
>a : number
|
||||
> : ^^^^^^
|
||||
>_tag : "B"
|
||||
> : ^^^
|
||||
>b : number
|
||||
> : ^^^^^^
|
||||
|
||||
const matcher = typeTags<Value>();
|
||||
>matcher : <P extends { readonly A: (_: { _tag: "A"; a: number; }) => any; readonly B: (_: { _tag: "B"; b: number; }) => any; } & { readonly [Tag in Exclude<keyof P, "A" | "B">]: never; }>(fields: P) => unknown
|
||||
> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^ ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^
|
||||
>typeTags<Value>() : <P extends { readonly A: (_: { _tag: "A"; a: number; }) => any; readonly B: (_: { _tag: "B"; b: number; }) => any; } & { readonly [Tag in Exclude<keyof P, "A" | "B">]: never; }>(fields: P) => unknown
|
||||
> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^ ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^
|
||||
>typeTags : <I>() => <P extends { readonly [Tag in Tags<"_tag", I> & string]: (_: Extract<I, { readonly _tag: Tag; }>) => any; } & { readonly [Tag in Exclude<keyof P, Tags<"_tag", I>>]: never; }>(fields: P) => unknown
|
||||
> : ^ ^^^^^^^
|
||||
|
||||
matcher({
|
||||
>matcher({ A: (_) => _.a, B: (_) => "fail",}) : unknown
|
||||
> : ^^^^^^^
|
||||
>matcher : <P extends { readonly A: (_: { _tag: "A"; a: number; }) => any; readonly B: (_: { _tag: "B"; b: number; }) => any; } & { readonly [Tag in Exclude<keyof P, "A" | "B">]: never; }>(fields: P) => unknown
|
||||
> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^ ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^
|
||||
>{ A: (_) => _.a, B: (_) => "fail",} : { A: (_: { _tag: "A"; a: number; }) => number; B: (_: { _tag: "B"; b: number; }) => string; }
|
||||
> : ^^^^^^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^
|
||||
|
||||
A: (_) => _.a,
|
||||
>A : (_: { _tag: "A"; a: number; }) => number
|
||||
> : ^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^
|
||||
>(_) => _.a : (_: { _tag: "A"; a: number; }) => number
|
||||
> : ^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^
|
||||
>_ : { _tag: "A"; a: number; }
|
||||
> : ^^^^^^^^ ^^^^^ ^^^
|
||||
>_.a : number
|
||||
> : ^^^^^^
|
||||
>_ : { _tag: "A"; a: number; }
|
||||
> : ^^^^^^^^ ^^^^^ ^^^
|
||||
>a : number
|
||||
> : ^^^^^^
|
||||
|
||||
B: (_) => "fail",
|
||||
>B : (_: { _tag: "B"; b: number; }) => string
|
||||
> : ^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^
|
||||
>(_) => "fail" : (_: { _tag: "B"; b: number; }) => string
|
||||
> : ^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^
|
||||
>_ : { _tag: "B"; b: number; }
|
||||
> : ^^^^^^^^ ^^^^^ ^^^
|
||||
>"fail" : "fail"
|
||||
> : ^^^^^^
|
||||
|
||||
});
|
||||
|
||||
matcher({
|
||||
>matcher({ A: (_) => _.a, B: (_) => "fail", C: (_) => "fail",}) : unknown
|
||||
> : ^^^^^^^
|
||||
>matcher : <P extends { readonly A: (_: { _tag: "A"; a: number; }) => any; readonly B: (_: { _tag: "B"; b: number; }) => any; } & { readonly [Tag in Exclude<keyof P, "A" | "B">]: never; }>(fields: P) => unknown
|
||||
> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^ ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^
|
||||
>{ A: (_) => _.a, B: (_) => "fail", C: (_) => "fail",} : { A: (_: { _tag: "A"; a: number; }) => number; B: (_: { _tag: "B"; b: number; }) => string; C: (_: any) => string; }
|
||||
> : ^^^^^^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
A: (_) => _.a,
|
||||
>A : (_: { _tag: "A"; a: number; }) => number
|
||||
> : ^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^
|
||||
>(_) => _.a : (_: { _tag: "A"; a: number; }) => number
|
||||
> : ^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^
|
||||
>_ : { _tag: "A"; a: number; }
|
||||
> : ^^^^^^^^ ^^^^^ ^^^
|
||||
>_.a : number
|
||||
> : ^^^^^^
|
||||
>_ : { _tag: "A"; a: number; }
|
||||
> : ^^^^^^^^ ^^^^^ ^^^
|
||||
>a : number
|
||||
> : ^^^^^^
|
||||
|
||||
B: (_) => "fail",
|
||||
>B : (_: { _tag: "B"; b: number; }) => string
|
||||
> : ^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^
|
||||
>(_) => "fail" : (_: { _tag: "B"; b: number; }) => string
|
||||
> : ^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^^^^^^^
|
||||
>_ : { _tag: "B"; b: number; }
|
||||
> : ^^^^^^^^ ^^^^^ ^^^
|
||||
>"fail" : "fail"
|
||||
> : ^^^^^^
|
||||
|
||||
C: (_) => "fail",
|
||||
>C : (_: any) => string
|
||||
> : ^ ^^^^^^^^^^^^^^^^
|
||||
>(_) => "fail" : (_: any) => string
|
||||
> : ^ ^^^^^^^^^^^^^^^^
|
||||
>_ : any
|
||||
> : ^^^
|
||||
>"fail" : "fail"
|
||||
> : ^^^^^^
|
||||
|
||||
});
|
||||
|
|
@ -0,0 +1,129 @@
|
|||
//// [tests/cases/compiler/contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts] ////
|
||||
|
||||
=== contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts ===
|
||||
type MappedOmit<T, K extends keyof any> = { [P in keyof T as Exclude<P, K>]: T[P]; }
|
||||
>MappedOmit : Symbol(MappedOmit, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 0, 0))
|
||||
>T : Symbol(T, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 0, 16))
|
||||
>K : Symbol(K, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 0, 18))
|
||||
>P : Symbol(P, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 0, 45))
|
||||
>T : Symbol(T, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 0, 16))
|
||||
>Exclude : Symbol(Exclude, Decl(lib.es5.d.ts, --, --))
|
||||
>P : Symbol(P, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 0, 45))
|
||||
>K : Symbol(K, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 0, 18))
|
||||
>T : Symbol(T, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 0, 16))
|
||||
>P : Symbol(P, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 0, 45))
|
||||
|
||||
type IntrinsicElements = {
|
||||
>IntrinsicElements : Symbol(IntrinsicElements, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 0, 84))
|
||||
|
||||
div: {
|
||||
>div : Symbol(div, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 2, 26))
|
||||
|
||||
onChange: (ev: Event) => void;
|
||||
>onChange : Symbol(onChange, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 3, 8))
|
||||
>ev : Symbol(ev, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 4, 15))
|
||||
>Event : Symbol(Event, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --))
|
||||
|
||||
};
|
||||
span: {
|
||||
>span : Symbol(span, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 5, 4))
|
||||
|
||||
onChange: (ev: Event) => void;
|
||||
>onChange : Symbol(onChange, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 6, 9))
|
||||
>ev : Symbol(ev, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 7, 15))
|
||||
>Event : Symbol(Event, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --))
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
type ElementType = keyof IntrinsicElements;
|
||||
>ElementType : Symbol(ElementType, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 9, 2))
|
||||
>IntrinsicElements : Symbol(IntrinsicElements, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 0, 84))
|
||||
|
||||
let DEFAULT_TABS_TAG = "div" as const;
|
||||
>DEFAULT_TABS_TAG : Symbol(DEFAULT_TABS_TAG, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 13, 3))
|
||||
>const : Symbol(const)
|
||||
|
||||
type Props<TTag extends ElementType, Overrides = {}> = MappedOmit<
|
||||
>Props : Symbol(Props, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 13, 38))
|
||||
>TTag : Symbol(TTag, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 15, 11))
|
||||
>ElementType : Symbol(ElementType, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 9, 2))
|
||||
>Overrides : Symbol(Overrides, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 15, 36))
|
||||
>MappedOmit : Symbol(MappedOmit, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 0, 0))
|
||||
|
||||
IntrinsicElements[TTag],
|
||||
>IntrinsicElements : Symbol(IntrinsicElements, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 0, 84))
|
||||
>TTag : Symbol(TTag, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 15, 11))
|
||||
|
||||
keyof Overrides
|
||||
>Overrides : Symbol(Overrides, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 15, 36))
|
||||
|
||||
> &
|
||||
Overrides;
|
||||
>Overrides : Symbol(Overrides, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 15, 36))
|
||||
|
||||
type TabGroupProps<TTag extends ElementType = typeof DEFAULT_TABS_TAG> = Props<
|
||||
>TabGroupProps : Symbol(TabGroupProps, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 19, 12))
|
||||
>TTag : Symbol(TTag, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 21, 19))
|
||||
>ElementType : Symbol(ElementType, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 9, 2))
|
||||
>DEFAULT_TABS_TAG : Symbol(DEFAULT_TABS_TAG, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 13, 3))
|
||||
>Props : Symbol(Props, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 13, 38))
|
||||
|
||||
TTag,
|
||||
>TTag : Symbol(TTag, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 21, 19))
|
||||
{
|
||||
defaultIndex?: number;
|
||||
>defaultIndex : Symbol(defaultIndex, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 23, 3))
|
||||
|
||||
onChange?: (index: number) => void;
|
||||
>onChange : Symbol(onChange, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 24, 26))
|
||||
>index : Symbol(index, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 25, 16))
|
||||
|
||||
selectedIndex?: number;
|
||||
>selectedIndex : Symbol(selectedIndex, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 25, 39))
|
||||
|
||||
vertical?: boolean;
|
||||
>vertical : Symbol(vertical, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 26, 27))
|
||||
|
||||
manual?: boolean;
|
||||
>manual : Symbol(manual, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 27, 23))
|
||||
}
|
||||
>;
|
||||
|
||||
interface _internal_ComponentTabGroup {
|
||||
>_internal_ComponentTabGroup : Symbol(_internal_ComponentTabGroup, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 30, 2))
|
||||
|
||||
<TTag extends ElementType = typeof DEFAULT_TABS_TAG>(
|
||||
>TTag : Symbol(TTag, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 33, 3))
|
||||
>ElementType : Symbol(ElementType, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 9, 2))
|
||||
>DEFAULT_TABS_TAG : Symbol(DEFAULT_TABS_TAG, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 13, 3))
|
||||
|
||||
props: TabGroupProps<TTag>,
|
||||
>props : Symbol(props, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 33, 55))
|
||||
>TabGroupProps : Symbol(TabGroupProps, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 19, 12))
|
||||
>TTag : Symbol(TTag, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 33, 3))
|
||||
|
||||
): null;
|
||||
}
|
||||
|
||||
declare let TabGroup: _internal_ComponentTabGroup;
|
||||
>TabGroup : Symbol(TabGroup, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 38, 11))
|
||||
>_internal_ComponentTabGroup : Symbol(_internal_ComponentTabGroup, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 30, 2))
|
||||
|
||||
TabGroup({
|
||||
>TabGroup : Symbol(TabGroup, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 38, 11))
|
||||
|
||||
defaultIndex: 0,
|
||||
>defaultIndex : Symbol(defaultIndex, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 40, 10))
|
||||
|
||||
onChange: (index) => {
|
||||
>onChange : Symbol(onChange, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 41, 18))
|
||||
>index : Symbol(index, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 42, 13))
|
||||
|
||||
const i: number = index;
|
||||
>i : Symbol(i, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 43, 9))
|
||||
>index : Symbol(index, Decl(contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts, 42, 13))
|
||||
|
||||
},
|
||||
});
|
||||
|
|
@ -0,0 +1,135 @@
|
|||
//// [tests/cases/compiler/contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts] ////
|
||||
|
||||
=== contextualTypesNegatedTypeLikeConstraintInGenericMappedType3.ts ===
|
||||
type MappedOmit<T, K extends keyof any> = { [P in keyof T as Exclude<P, K>]: T[P]; }
|
||||
>MappedOmit : MappedOmit<T, K>
|
||||
> : ^^^^^^^^^^^^^^^^
|
||||
|
||||
type IntrinsicElements = {
|
||||
>IntrinsicElements : IntrinsicElements
|
||||
> : ^^^^^^^^^^^^^^^^^
|
||||
|
||||
div: {
|
||||
>div : { onChange: (ev: Event) => void; }
|
||||
> : ^^^^^^^^^^^^ ^^^
|
||||
|
||||
onChange: (ev: Event) => void;
|
||||
>onChange : (ev: Event) => void
|
||||
> : ^ ^^ ^^^^^
|
||||
>ev : Event
|
||||
> : ^^^^^
|
||||
|
||||
};
|
||||
span: {
|
||||
>span : { onChange: (ev: Event) => void; }
|
||||
> : ^^^^^^^^^^^^ ^^^
|
||||
|
||||
onChange: (ev: Event) => void;
|
||||
>onChange : (ev: Event) => void
|
||||
> : ^ ^^ ^^^^^
|
||||
>ev : Event
|
||||
> : ^^^^^
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
type ElementType = keyof IntrinsicElements;
|
||||
>ElementType : keyof IntrinsicElements
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
let DEFAULT_TABS_TAG = "div" as const;
|
||||
>DEFAULT_TABS_TAG : "div"
|
||||
> : ^^^^^
|
||||
>"div" as const : "div"
|
||||
> : ^^^^^
|
||||
>"div" : "div"
|
||||
> : ^^^^^
|
||||
|
||||
type Props<TTag extends ElementType, Overrides = {}> = MappedOmit<
|
||||
>Props : Props<TTag, Overrides>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
IntrinsicElements[TTag],
|
||||
keyof Overrides
|
||||
> &
|
||||
Overrides;
|
||||
|
||||
type TabGroupProps<TTag extends ElementType = typeof DEFAULT_TABS_TAG> = Props<
|
||||
>TabGroupProps : TabGroupProps<TTag>
|
||||
> : ^^^^^^^^^^^^^^^^^^^
|
||||
>DEFAULT_TABS_TAG : "div"
|
||||
> : ^^^^^
|
||||
|
||||
TTag,
|
||||
{
|
||||
defaultIndex?: number;
|
||||
>defaultIndex : number | undefined
|
||||
> : ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
onChange?: (index: number) => void;
|
||||
>onChange : ((index: number) => void) | undefined
|
||||
> : ^^ ^^ ^^^^^ ^^^^^^^^^^^^^
|
||||
>index : number
|
||||
> : ^^^^^^
|
||||
|
||||
selectedIndex?: number;
|
||||
>selectedIndex : number | undefined
|
||||
> : ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
vertical?: boolean;
|
||||
>vertical : boolean | undefined
|
||||
> : ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
manual?: boolean;
|
||||
>manual : boolean | undefined
|
||||
> : ^^^^^^^^^^^^^^^^^^^
|
||||
}
|
||||
>;
|
||||
|
||||
interface _internal_ComponentTabGroup {
|
||||
<TTag extends ElementType = typeof DEFAULT_TABS_TAG>(
|
||||
>DEFAULT_TABS_TAG : "div"
|
||||
> : ^^^^^
|
||||
|
||||
props: TabGroupProps<TTag>,
|
||||
>props : TabGroupProps<TTag>
|
||||
> : ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
): null;
|
||||
}
|
||||
|
||||
declare let TabGroup: _internal_ComponentTabGroup;
|
||||
>TabGroup : _internal_ComponentTabGroup
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
TabGroup({
|
||||
>TabGroup({ defaultIndex: 0, onChange: (index) => { const i: number = index; },}) : null
|
||||
> : ^^^^
|
||||
>TabGroup : _internal_ComponentTabGroup
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>{ defaultIndex: 0, onChange: (index) => { const i: number = index; },} : { defaultIndex: number; onChange: (index: number) => void; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
defaultIndex: 0,
|
||||
>defaultIndex : number
|
||||
> : ^^^^^^
|
||||
>0 : 0
|
||||
> : ^
|
||||
|
||||
onChange: (index) => {
|
||||
>onChange : (index: number) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^
|
||||
>(index) => { const i: number = index; } : (index: number) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^
|
||||
>index : number
|
||||
> : ^^^^^^
|
||||
|
||||
const i: number = index;
|
||||
>i : number
|
||||
> : ^^^^^^
|
||||
>index : number
|
||||
> : ^^^^^^
|
||||
|
||||
},
|
||||
});
|
||||
|
|
@ -0,0 +1,73 @@
|
|||
//// [tests/cases/compiler/contextuallyTypedJsxAttribute2.tsx] ////
|
||||
|
||||
=== contextuallyTypedJsxAttribute2.tsx ===
|
||||
/// <reference path="react16.d.ts" />
|
||||
|
||||
import React from "react";
|
||||
>React : Symbol(React, Decl(contextuallyTypedJsxAttribute2.tsx, 2, 6))
|
||||
|
||||
import { ComponentPropsWithRef, ElementType } from "react";
|
||||
>ComponentPropsWithRef : Symbol(ComponentPropsWithRef, Decl(contextuallyTypedJsxAttribute2.tsx, 3, 8))
|
||||
>ElementType : Symbol(ElementType, Decl(contextuallyTypedJsxAttribute2.tsx, 3, 31))
|
||||
|
||||
function UnwrappedLink<T extends ElementType = ElementType>(
|
||||
>UnwrappedLink : Symbol(UnwrappedLink, Decl(contextuallyTypedJsxAttribute2.tsx, 3, 59))
|
||||
>T : Symbol(T, Decl(contextuallyTypedJsxAttribute2.tsx, 5, 23))
|
||||
>ElementType : Symbol(ElementType, Decl(contextuallyTypedJsxAttribute2.tsx, 3, 31))
|
||||
>ElementType : Symbol(ElementType, Decl(contextuallyTypedJsxAttribute2.tsx, 3, 31))
|
||||
|
||||
props: Omit<ComponentPropsWithRef<ElementType extends T ? "a" : T>, "as">,
|
||||
>props : Symbol(props, Decl(contextuallyTypedJsxAttribute2.tsx, 5, 60))
|
||||
>Omit : Symbol(Omit, Decl(lib.es5.d.ts, --, --))
|
||||
>ComponentPropsWithRef : Symbol(ComponentPropsWithRef, Decl(contextuallyTypedJsxAttribute2.tsx, 3, 8))
|
||||
>ElementType : Symbol(ElementType, Decl(contextuallyTypedJsxAttribute2.tsx, 3, 31))
|
||||
>T : Symbol(T, Decl(contextuallyTypedJsxAttribute2.tsx, 5, 23))
|
||||
>T : Symbol(T, Decl(contextuallyTypedJsxAttribute2.tsx, 5, 23))
|
||||
|
||||
) {
|
||||
return <a></a>;
|
||||
>a : Symbol(JSX.IntrinsicElements.a, Decl(react16.d.ts, 2516, 41))
|
||||
>a : Symbol(JSX.IntrinsicElements.a, Decl(react16.d.ts, 2516, 41))
|
||||
}
|
||||
|
||||
<UnwrappedLink onClick={(e) => {}} />;
|
||||
>UnwrappedLink : Symbol(UnwrappedLink, Decl(contextuallyTypedJsxAttribute2.tsx, 3, 59))
|
||||
>onClick : Symbol(onClick, Decl(contextuallyTypedJsxAttribute2.tsx, 11, 14))
|
||||
>e : Symbol(e, Decl(contextuallyTypedJsxAttribute2.tsx, 11, 25))
|
||||
|
||||
function UnwrappedLink2<T extends ElementType = ElementType>(
|
||||
>UnwrappedLink2 : Symbol(UnwrappedLink2, Decl(contextuallyTypedJsxAttribute2.tsx, 11, 38))
|
||||
>T : Symbol(T, Decl(contextuallyTypedJsxAttribute2.tsx, 13, 24))
|
||||
>ElementType : Symbol(ElementType, Decl(contextuallyTypedJsxAttribute2.tsx, 3, 31))
|
||||
>ElementType : Symbol(ElementType, Decl(contextuallyTypedJsxAttribute2.tsx, 3, 31))
|
||||
|
||||
props: Omit<ComponentPropsWithRef<ElementType extends T ? "a" : T>, "as"> & {
|
||||
>props : Symbol(props, Decl(contextuallyTypedJsxAttribute2.tsx, 13, 61))
|
||||
>Omit : Symbol(Omit, Decl(lib.es5.d.ts, --, --))
|
||||
>ComponentPropsWithRef : Symbol(ComponentPropsWithRef, Decl(contextuallyTypedJsxAttribute2.tsx, 3, 8))
|
||||
>ElementType : Symbol(ElementType, Decl(contextuallyTypedJsxAttribute2.tsx, 3, 31))
|
||||
>T : Symbol(T, Decl(contextuallyTypedJsxAttribute2.tsx, 13, 24))
|
||||
>T : Symbol(T, Decl(contextuallyTypedJsxAttribute2.tsx, 13, 24))
|
||||
|
||||
as?: T;
|
||||
>as : Symbol(as, Decl(contextuallyTypedJsxAttribute2.tsx, 14, 79))
|
||||
>T : Symbol(T, Decl(contextuallyTypedJsxAttribute2.tsx, 13, 24))
|
||||
|
||||
},
|
||||
) {
|
||||
return <a></a>;
|
||||
>a : Symbol(JSX.IntrinsicElements.a, Decl(react16.d.ts, 2516, 41))
|
||||
>a : Symbol(JSX.IntrinsicElements.a, Decl(react16.d.ts, 2516, 41))
|
||||
}
|
||||
|
||||
<UnwrappedLink2 onClick={(e) => {}} />;
|
||||
>UnwrappedLink2 : Symbol(UnwrappedLink2, Decl(contextuallyTypedJsxAttribute2.tsx, 11, 38))
|
||||
>onClick : Symbol(onClick, Decl(contextuallyTypedJsxAttribute2.tsx, 21, 15))
|
||||
>e : Symbol(e, Decl(contextuallyTypedJsxAttribute2.tsx, 21, 26))
|
||||
|
||||
<UnwrappedLink2 as="button" onClick={(e) => {}} />;
|
||||
>UnwrappedLink2 : Symbol(UnwrappedLink2, Decl(contextuallyTypedJsxAttribute2.tsx, 11, 38))
|
||||
>as : Symbol(as, Decl(contextuallyTypedJsxAttribute2.tsx, 22, 15))
|
||||
>onClick : Symbol(onClick, Decl(contextuallyTypedJsxAttribute2.tsx, 22, 27))
|
||||
>e : Symbol(e, Decl(contextuallyTypedJsxAttribute2.tsx, 22, 38))
|
||||
|
|
@ -0,0 +1,100 @@
|
|||
//// [tests/cases/compiler/contextuallyTypedJsxAttribute2.tsx] ////
|
||||
|
||||
=== Performance Stats ===
|
||||
Assignability cache: 5,000
|
||||
Type Count: 10,000
|
||||
Instantiation count: 250,000
|
||||
Symbol count: 100,000
|
||||
|
||||
=== contextuallyTypedJsxAttribute2.tsx ===
|
||||
/// <reference path="react16.d.ts" />
|
||||
|
||||
import React from "react";
|
||||
>React : typeof React
|
||||
> : ^^^^^^^^^^^^
|
||||
|
||||
import { ComponentPropsWithRef, ElementType } from "react";
|
||||
>ComponentPropsWithRef : any
|
||||
> : ^^^
|
||||
>ElementType : any
|
||||
> : ^^^
|
||||
|
||||
function UnwrappedLink<T extends ElementType = ElementType>(
|
||||
>UnwrappedLink : <T extends ElementType = React.ElementType>(props: Omit<ComponentPropsWithRef<ElementType extends T ? "a" : T>, "as">) => JSX.Element
|
||||
> : ^ ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^^^
|
||||
|
||||
props: Omit<ComponentPropsWithRef<ElementType extends T ? "a" : T>, "as">,
|
||||
>props : Omit<React.ComponentPropsWithRef<React.ElementType extends T ? "a" : T>, "as">
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
) {
|
||||
return <a></a>;
|
||||
><a></a> : JSX.Element
|
||||
> : ^^^^^^^^^^^
|
||||
>a : any
|
||||
> : ^^^
|
||||
>a : any
|
||||
> : ^^^
|
||||
}
|
||||
|
||||
<UnwrappedLink onClick={(e) => {}} />;
|
||||
><UnwrappedLink onClick={(e) => {}} /> : JSX.Element
|
||||
> : ^^^^^^^^^^^
|
||||
>UnwrappedLink : <T extends ElementType = React.ElementType>(props: Omit<ComponentPropsWithRef<ElementType extends T ? "a" : T>, "as">) => JSX.Element
|
||||
> : ^ ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^^^
|
||||
>onClick : (e: React.MouseEvent<HTMLAnchorElement>) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>(e) => {} : (e: React.MouseEvent<HTMLAnchorElement>) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>e : React.MouseEvent<HTMLAnchorElement>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
function UnwrappedLink2<T extends ElementType = ElementType>(
|
||||
>UnwrappedLink2 : <T extends ElementType = React.ElementType>(props: Omit<ComponentPropsWithRef<ElementType extends T ? "a" : T>, "as"> & { as?: T; }) => JSX.Element
|
||||
> : ^ ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^^^
|
||||
|
||||
props: Omit<ComponentPropsWithRef<ElementType extends T ? "a" : T>, "as"> & {
|
||||
>props : Omit<React.ComponentPropsWithRef<React.ElementType extends T ? "a" : T>, "as"> & { as?: T; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^
|
||||
|
||||
as?: T;
|
||||
>as : T | undefined
|
||||
> : ^^^^^^^^^^^^^
|
||||
|
||||
},
|
||||
) {
|
||||
return <a></a>;
|
||||
><a></a> : JSX.Element
|
||||
> : ^^^^^^^^^^^
|
||||
>a : any
|
||||
> : ^^^
|
||||
>a : any
|
||||
> : ^^^
|
||||
}
|
||||
|
||||
<UnwrappedLink2 onClick={(e) => {}} />;
|
||||
><UnwrappedLink2 onClick={(e) => {}} /> : JSX.Element
|
||||
> : ^^^^^^^^^^^
|
||||
>UnwrappedLink2 : <T extends ElementType = React.ElementType>(props: Omit<ComponentPropsWithRef<ElementType extends T ? "a" : T>, "as"> & { as?: T; }) => JSX.Element
|
||||
> : ^ ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^^^
|
||||
>onClick : (e: React.MouseEvent<HTMLAnchorElement>) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>(e) => {} : (e: React.MouseEvent<HTMLAnchorElement>) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>e : React.MouseEvent<HTMLAnchorElement>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
<UnwrappedLink2 as="button" onClick={(e) => {}} />;
|
||||
><UnwrappedLink2 as="button" onClick={(e) => {}} /> : JSX.Element
|
||||
> : ^^^^^^^^^^^
|
||||
>UnwrappedLink2 : <T extends ElementType = React.ElementType>(props: Omit<ComponentPropsWithRef<ElementType extends T ? "a" : T>, "as"> & { as?: T; }) => JSX.Element
|
||||
> : ^ ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^^^
|
||||
>as : "button"
|
||||
> : ^^^^^^^^
|
||||
>onClick : (e: React.MouseEvent<HTMLButtonElement>) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>(e) => {} : (e: React.MouseEvent<HTMLButtonElement>) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>e : React.MouseEvent<HTMLButtonElement>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
@ -0,0 +1,121 @@
|
|||
//// [tests/cases/compiler/reverseMappedIntersectionInference1.ts] ////
|
||||
|
||||
=== reverseMappedIntersectionInference1.ts ===
|
||||
type Results<T> = {
|
||||
>Results : Symbol(Results, Decl(reverseMappedIntersectionInference1.ts, 0, 0))
|
||||
>T : Symbol(T, Decl(reverseMappedIntersectionInference1.ts, 0, 13))
|
||||
|
||||
[K in keyof T]: {
|
||||
>K : Symbol(K, Decl(reverseMappedIntersectionInference1.ts, 1, 3))
|
||||
>T : Symbol(T, Decl(reverseMappedIntersectionInference1.ts, 0, 13))
|
||||
|
||||
data: T[K];
|
||||
>data : Symbol(data, Decl(reverseMappedIntersectionInference1.ts, 1, 19))
|
||||
>T : Symbol(T, Decl(reverseMappedIntersectionInference1.ts, 0, 13))
|
||||
>K : Symbol(K, Decl(reverseMappedIntersectionInference1.ts, 1, 3))
|
||||
|
||||
onSuccess: (data: T[K]) => void;
|
||||
>onSuccess : Symbol(onSuccess, Decl(reverseMappedIntersectionInference1.ts, 2, 15))
|
||||
>data : Symbol(data, Decl(reverseMappedIntersectionInference1.ts, 3, 16))
|
||||
>T : Symbol(T, Decl(reverseMappedIntersectionInference1.ts, 0, 13))
|
||||
>K : Symbol(K, Decl(reverseMappedIntersectionInference1.ts, 1, 3))
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
type Errors<E> = {
|
||||
>Errors : Symbol(Errors, Decl(reverseMappedIntersectionInference1.ts, 5, 2))
|
||||
>E : Symbol(E, Decl(reverseMappedIntersectionInference1.ts, 7, 12))
|
||||
|
||||
[K in keyof E]: {
|
||||
>K : Symbol(K, Decl(reverseMappedIntersectionInference1.ts, 8, 3))
|
||||
>E : Symbol(E, Decl(reverseMappedIntersectionInference1.ts, 7, 12))
|
||||
|
||||
error: E[K];
|
||||
>error : Symbol(error, Decl(reverseMappedIntersectionInference1.ts, 8, 19))
|
||||
>E : Symbol(E, Decl(reverseMappedIntersectionInference1.ts, 7, 12))
|
||||
>K : Symbol(K, Decl(reverseMappedIntersectionInference1.ts, 8, 3))
|
||||
|
||||
onError: (data: E[K]) => void;
|
||||
>onError : Symbol(onError, Decl(reverseMappedIntersectionInference1.ts, 9, 16))
|
||||
>data : Symbol(data, Decl(reverseMappedIntersectionInference1.ts, 10, 14))
|
||||
>E : Symbol(E, Decl(reverseMappedIntersectionInference1.ts, 7, 12))
|
||||
>K : Symbol(K, Decl(reverseMappedIntersectionInference1.ts, 8, 3))
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
declare function withKeyedObj<T, E>(
|
||||
>withKeyedObj : Symbol(withKeyedObj, Decl(reverseMappedIntersectionInference1.ts, 12, 2))
|
||||
>T : Symbol(T, Decl(reverseMappedIntersectionInference1.ts, 14, 30))
|
||||
>E : Symbol(E, Decl(reverseMappedIntersectionInference1.ts, 14, 32))
|
||||
|
||||
arg: Results<T> & Errors<E>
|
||||
>arg : Symbol(arg, Decl(reverseMappedIntersectionInference1.ts, 14, 36))
|
||||
>Results : Symbol(Results, Decl(reverseMappedIntersectionInference1.ts, 0, 0))
|
||||
>T : Symbol(T, Decl(reverseMappedIntersectionInference1.ts, 14, 30))
|
||||
>Errors : Symbol(Errors, Decl(reverseMappedIntersectionInference1.ts, 5, 2))
|
||||
>E : Symbol(E, Decl(reverseMappedIntersectionInference1.ts, 14, 32))
|
||||
|
||||
): [T, E];
|
||||
>T : Symbol(T, Decl(reverseMappedIntersectionInference1.ts, 14, 30))
|
||||
>E : Symbol(E, Decl(reverseMappedIntersectionInference1.ts, 14, 32))
|
||||
|
||||
const res = withKeyedObj({
|
||||
>res : Symbol(res, Decl(reverseMappedIntersectionInference1.ts, 18, 5))
|
||||
>withKeyedObj : Symbol(withKeyedObj, Decl(reverseMappedIntersectionInference1.ts, 12, 2))
|
||||
|
||||
a: {
|
||||
>a : Symbol(a, Decl(reverseMappedIntersectionInference1.ts, 18, 26))
|
||||
|
||||
data: "foo",
|
||||
>data : Symbol(data, Decl(reverseMappedIntersectionInference1.ts, 19, 6))
|
||||
|
||||
onSuccess: (dataArg) => {
|
||||
>onSuccess : Symbol(onSuccess, Decl(reverseMappedIntersectionInference1.ts, 20, 16))
|
||||
>dataArg : Symbol(dataArg, Decl(reverseMappedIntersectionInference1.ts, 21, 16))
|
||||
|
||||
dataArg;
|
||||
>dataArg : Symbol(dataArg, Decl(reverseMappedIntersectionInference1.ts, 21, 16))
|
||||
|
||||
},
|
||||
error: 404,
|
||||
>error : Symbol(error, Decl(reverseMappedIntersectionInference1.ts, 23, 6))
|
||||
|
||||
onError: (errorArg) => {
|
||||
>onError : Symbol(onError, Decl(reverseMappedIntersectionInference1.ts, 24, 15))
|
||||
>errorArg : Symbol(errorArg, Decl(reverseMappedIntersectionInference1.ts, 25, 14))
|
||||
|
||||
errorArg;
|
||||
>errorArg : Symbol(errorArg, Decl(reverseMappedIntersectionInference1.ts, 25, 14))
|
||||
|
||||
},
|
||||
},
|
||||
b: {
|
||||
>b : Symbol(b, Decl(reverseMappedIntersectionInference1.ts, 28, 4))
|
||||
|
||||
data: true,
|
||||
>data : Symbol(data, Decl(reverseMappedIntersectionInference1.ts, 29, 6))
|
||||
|
||||
onSuccess: (dataArg) => {
|
||||
>onSuccess : Symbol(onSuccess, Decl(reverseMappedIntersectionInference1.ts, 30, 15))
|
||||
>dataArg : Symbol(dataArg, Decl(reverseMappedIntersectionInference1.ts, 31, 16))
|
||||
|
||||
dataArg;
|
||||
>dataArg : Symbol(dataArg, Decl(reverseMappedIntersectionInference1.ts, 31, 16))
|
||||
|
||||
},
|
||||
error: 500,
|
||||
>error : Symbol(error, Decl(reverseMappedIntersectionInference1.ts, 33, 6))
|
||||
|
||||
onError: (errorArg) => {
|
||||
>onError : Symbol(onError, Decl(reverseMappedIntersectionInference1.ts, 34, 15))
|
||||
>errorArg : Symbol(errorArg, Decl(reverseMappedIntersectionInference1.ts, 35, 14))
|
||||
|
||||
errorArg;
|
||||
>errorArg : Symbol(errorArg, Decl(reverseMappedIntersectionInference1.ts, 35, 14))
|
||||
|
||||
},
|
||||
},
|
||||
});
|
||||
|
|
@ -0,0 +1,151 @@
|
|||
//// [tests/cases/compiler/reverseMappedIntersectionInference1.ts] ////
|
||||
|
||||
=== reverseMappedIntersectionInference1.ts ===
|
||||
type Results<T> = {
|
||||
>Results : Results<T>
|
||||
> : ^^^^^^^^^^
|
||||
|
||||
[K in keyof T]: {
|
||||
data: T[K];
|
||||
>data : T[K]
|
||||
> : ^^^^
|
||||
|
||||
onSuccess: (data: T[K]) => void;
|
||||
>onSuccess : (data: T[K]) => void
|
||||
> : ^ ^^ ^^^^^
|
||||
>data : T[K]
|
||||
> : ^^^^
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
type Errors<E> = {
|
||||
>Errors : Errors<E>
|
||||
> : ^^^^^^^^^
|
||||
|
||||
[K in keyof E]: {
|
||||
error: E[K];
|
||||
>error : E[K]
|
||||
> : ^^^^
|
||||
|
||||
onError: (data: E[K]) => void;
|
||||
>onError : (data: E[K]) => void
|
||||
> : ^ ^^ ^^^^^
|
||||
>data : E[K]
|
||||
> : ^^^^
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
declare function withKeyedObj<T, E>(
|
||||
>withKeyedObj : <T, E>(arg: Results<T> & Errors<E>) => [T, E]
|
||||
> : ^ ^^ ^^ ^^ ^^^^^
|
||||
|
||||
arg: Results<T> & Errors<E>
|
||||
>arg : Results<T> & Errors<E>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
): [T, E];
|
||||
|
||||
const res = withKeyedObj({
|
||||
>res : [{ a: string; b: boolean; }, { a: number; b: number; }]
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>withKeyedObj({ a: { data: "foo", onSuccess: (dataArg) => { dataArg; }, error: 404, onError: (errorArg) => { errorArg; }, }, b: { data: true, onSuccess: (dataArg) => { dataArg; }, error: 500, onError: (errorArg) => { errorArg; }, },}) : [{ a: string; b: boolean; }, { a: number; b: number; }]
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>withKeyedObj : <T, E>(arg: Results<T> & Errors<E>) => [T, E]
|
||||
> : ^ ^^ ^^ ^^ ^^^^^
|
||||
>{ a: { data: "foo", onSuccess: (dataArg) => { dataArg; }, error: 404, onError: (errorArg) => { errorArg; }, }, b: { data: true, onSuccess: (dataArg) => { dataArg; }, error: 500, onError: (errorArg) => { errorArg; }, },} : { a: { data: string; onSuccess: (dataArg: string) => void; error: number; onError: (errorArg: number) => void; }; b: { data: true; onSuccess: (dataArg: boolean) => void; error: number; onError: (errorArg: number) => void; }; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
a: {
|
||||
>a : { data: string; onSuccess: (dataArg: string) => void; error: number; onError: (errorArg: number) => void; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^
|
||||
>{ data: "foo", onSuccess: (dataArg) => { dataArg; }, error: 404, onError: (errorArg) => { errorArg; }, } : { data: string; onSuccess: (dataArg: string) => void; error: number; onError: (errorArg: number) => void; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
data: "foo",
|
||||
>data : string
|
||||
> : ^^^^^^
|
||||
>"foo" : "foo"
|
||||
> : ^^^^^
|
||||
|
||||
onSuccess: (dataArg) => {
|
||||
>onSuccess : (dataArg: string) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^
|
||||
>(dataArg) => { dataArg; } : (dataArg: string) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^
|
||||
>dataArg : string
|
||||
> : ^^^^^^
|
||||
|
||||
dataArg;
|
||||
>dataArg : string
|
||||
> : ^^^^^^
|
||||
|
||||
},
|
||||
error: 404,
|
||||
>error : number
|
||||
> : ^^^^^^
|
||||
>404 : 404
|
||||
> : ^^^
|
||||
|
||||
onError: (errorArg) => {
|
||||
>onError : (errorArg: number) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^
|
||||
>(errorArg) => { errorArg; } : (errorArg: number) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^
|
||||
>errorArg : number
|
||||
> : ^^^^^^
|
||||
|
||||
errorArg;
|
||||
>errorArg : number
|
||||
> : ^^^^^^
|
||||
|
||||
},
|
||||
},
|
||||
b: {
|
||||
>b : { data: true; onSuccess: (dataArg: boolean) => void; error: number; onError: (errorArg: number) => void; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^
|
||||
>{ data: true, onSuccess: (dataArg) => { dataArg; }, error: 500, onError: (errorArg) => { errorArg; }, } : { data: true; onSuccess: (dataArg: boolean) => void; error: number; onError: (errorArg: number) => void; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
data: true,
|
||||
>data : true
|
||||
> : ^^^^
|
||||
>true : true
|
||||
> : ^^^^
|
||||
|
||||
onSuccess: (dataArg) => {
|
||||
>onSuccess : (dataArg: boolean) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^^
|
||||
>(dataArg) => { dataArg; } : (dataArg: boolean) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^^
|
||||
>dataArg : boolean
|
||||
> : ^^^^^^^
|
||||
|
||||
dataArg;
|
||||
>dataArg : boolean
|
||||
> : ^^^^^^^
|
||||
|
||||
},
|
||||
error: 500,
|
||||
>error : number
|
||||
> : ^^^^^^
|
||||
>500 : 500
|
||||
> : ^^^
|
||||
|
||||
onError: (errorArg) => {
|
||||
>onError : (errorArg: number) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^
|
||||
>(errorArg) => { errorArg; } : (errorArg: number) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^
|
||||
>errorArg : number
|
||||
> : ^^^^^^
|
||||
|
||||
errorArg;
|
||||
>errorArg : number
|
||||
> : ^^^^^^
|
||||
|
||||
},
|
||||
},
|
||||
});
|
||||
|
|
@ -0,0 +1,118 @@
|
|||
//// [tests/cases/compiler/reverseMappedIntersectionInference2.ts] ////
|
||||
|
||||
=== reverseMappedIntersectionInference2.ts ===
|
||||
type Results<T> = {
|
||||
>Results : Symbol(Results, Decl(reverseMappedIntersectionInference2.ts, 0, 0))
|
||||
>T : Symbol(T, Decl(reverseMappedIntersectionInference2.ts, 0, 13))
|
||||
|
||||
[K in keyof T]: {
|
||||
>K : Symbol(K, Decl(reverseMappedIntersectionInference2.ts, 1, 3))
|
||||
>T : Symbol(T, Decl(reverseMappedIntersectionInference2.ts, 0, 13))
|
||||
|
||||
data: T[K];
|
||||
>data : Symbol(data, Decl(reverseMappedIntersectionInference2.ts, 1, 19))
|
||||
>T : Symbol(T, Decl(reverseMappedIntersectionInference2.ts, 0, 13))
|
||||
>K : Symbol(K, Decl(reverseMappedIntersectionInference2.ts, 1, 3))
|
||||
|
||||
onSuccess: (data: T[K]) => void;
|
||||
>onSuccess : Symbol(onSuccess, Decl(reverseMappedIntersectionInference2.ts, 2, 15))
|
||||
>data : Symbol(data, Decl(reverseMappedIntersectionInference2.ts, 3, 16))
|
||||
>T : Symbol(T, Decl(reverseMappedIntersectionInference2.ts, 0, 13))
|
||||
>K : Symbol(K, Decl(reverseMappedIntersectionInference2.ts, 1, 3))
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
type Errors<E> = {
|
||||
>Errors : Symbol(Errors, Decl(reverseMappedIntersectionInference2.ts, 5, 2))
|
||||
>E : Symbol(E, Decl(reverseMappedIntersectionInference2.ts, 7, 12))
|
||||
|
||||
[K in keyof E]: {
|
||||
>K : Symbol(K, Decl(reverseMappedIntersectionInference2.ts, 8, 3))
|
||||
>E : Symbol(E, Decl(reverseMappedIntersectionInference2.ts, 7, 12))
|
||||
|
||||
error: E[K];
|
||||
>error : Symbol(error, Decl(reverseMappedIntersectionInference2.ts, 8, 19))
|
||||
>E : Symbol(E, Decl(reverseMappedIntersectionInference2.ts, 7, 12))
|
||||
>K : Symbol(K, Decl(reverseMappedIntersectionInference2.ts, 8, 3))
|
||||
|
||||
onError: (data: E[K]) => void;
|
||||
>onError : Symbol(onError, Decl(reverseMappedIntersectionInference2.ts, 9, 16))
|
||||
>data : Symbol(data, Decl(reverseMappedIntersectionInference2.ts, 10, 14))
|
||||
>E : Symbol(E, Decl(reverseMappedIntersectionInference2.ts, 7, 12))
|
||||
>K : Symbol(K, Decl(reverseMappedIntersectionInference2.ts, 8, 3))
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
declare function withTupleLike<T extends { 0: unknown }, E extends { 0: unknown }>(
|
||||
>withTupleLike : Symbol(withTupleLike, Decl(reverseMappedIntersectionInference2.ts, 12, 2))
|
||||
>T : Symbol(T, Decl(reverseMappedIntersectionInference2.ts, 14, 31))
|
||||
>0 : Symbol(0, Decl(reverseMappedIntersectionInference2.ts, 14, 42))
|
||||
>E : Symbol(E, Decl(reverseMappedIntersectionInference2.ts, 14, 56))
|
||||
>0 : Symbol(0, Decl(reverseMappedIntersectionInference2.ts, 14, 68))
|
||||
|
||||
arg: Results<T> & Errors<E>
|
||||
>arg : Symbol(arg, Decl(reverseMappedIntersectionInference2.ts, 14, 83))
|
||||
>Results : Symbol(Results, Decl(reverseMappedIntersectionInference2.ts, 0, 0))
|
||||
>T : Symbol(T, Decl(reverseMappedIntersectionInference2.ts, 14, 31))
|
||||
>Errors : Symbol(Errors, Decl(reverseMappedIntersectionInference2.ts, 5, 2))
|
||||
>E : Symbol(E, Decl(reverseMappedIntersectionInference2.ts, 14, 56))
|
||||
|
||||
): [T, E];
|
||||
>T : Symbol(T, Decl(reverseMappedIntersectionInference2.ts, 14, 31))
|
||||
>E : Symbol(E, Decl(reverseMappedIntersectionInference2.ts, 14, 56))
|
||||
|
||||
const res = withTupleLike([
|
||||
>res : Symbol(res, Decl(reverseMappedIntersectionInference2.ts, 18, 5))
|
||||
>withTupleLike : Symbol(withTupleLike, Decl(reverseMappedIntersectionInference2.ts, 12, 2))
|
||||
{
|
||||
data: "foo",
|
||||
>data : Symbol(data, Decl(reverseMappedIntersectionInference2.ts, 19, 3))
|
||||
|
||||
onSuccess: (dataArg) => {
|
||||
>onSuccess : Symbol(onSuccess, Decl(reverseMappedIntersectionInference2.ts, 20, 16))
|
||||
>dataArg : Symbol(dataArg, Decl(reverseMappedIntersectionInference2.ts, 21, 16))
|
||||
|
||||
dataArg;
|
||||
>dataArg : Symbol(dataArg, Decl(reverseMappedIntersectionInference2.ts, 21, 16))
|
||||
|
||||
},
|
||||
error: 404,
|
||||
>error : Symbol(error, Decl(reverseMappedIntersectionInference2.ts, 23, 6))
|
||||
|
||||
onError: (errorArg) => {
|
||||
>onError : Symbol(onError, Decl(reverseMappedIntersectionInference2.ts, 24, 15))
|
||||
>errorArg : Symbol(errorArg, Decl(reverseMappedIntersectionInference2.ts, 25, 14))
|
||||
|
||||
errorArg;
|
||||
>errorArg : Symbol(errorArg, Decl(reverseMappedIntersectionInference2.ts, 25, 14))
|
||||
|
||||
},
|
||||
},
|
||||
{
|
||||
data: true,
|
||||
>data : Symbol(data, Decl(reverseMappedIntersectionInference2.ts, 29, 3))
|
||||
|
||||
onSuccess: (dataArg) => {
|
||||
>onSuccess : Symbol(onSuccess, Decl(reverseMappedIntersectionInference2.ts, 30, 15))
|
||||
>dataArg : Symbol(dataArg, Decl(reverseMappedIntersectionInference2.ts, 31, 16))
|
||||
|
||||
dataArg;
|
||||
>dataArg : Symbol(dataArg, Decl(reverseMappedIntersectionInference2.ts, 31, 16))
|
||||
|
||||
},
|
||||
error: 500,
|
||||
>error : Symbol(error, Decl(reverseMappedIntersectionInference2.ts, 33, 6))
|
||||
|
||||
onError: (errorArg) => {
|
||||
>onError : Symbol(onError, Decl(reverseMappedIntersectionInference2.ts, 34, 15))
|
||||
>errorArg : Symbol(errorArg, Decl(reverseMappedIntersectionInference2.ts, 35, 14))
|
||||
|
||||
errorArg;
|
||||
>errorArg : Symbol(errorArg, Decl(reverseMappedIntersectionInference2.ts, 35, 14))
|
||||
|
||||
},
|
||||
},
|
||||
]);
|
||||
|
|
@ -0,0 +1,150 @@
|
|||
//// [tests/cases/compiler/reverseMappedIntersectionInference2.ts] ////
|
||||
|
||||
=== reverseMappedIntersectionInference2.ts ===
|
||||
type Results<T> = {
|
||||
>Results : Results<T>
|
||||
> : ^^^^^^^^^^
|
||||
|
||||
[K in keyof T]: {
|
||||
data: T[K];
|
||||
>data : T[K]
|
||||
> : ^^^^
|
||||
|
||||
onSuccess: (data: T[K]) => void;
|
||||
>onSuccess : (data: T[K]) => void
|
||||
> : ^ ^^ ^^^^^
|
||||
>data : T[K]
|
||||
> : ^^^^
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
type Errors<E> = {
|
||||
>Errors : Errors<E>
|
||||
> : ^^^^^^^^^
|
||||
|
||||
[K in keyof E]: {
|
||||
error: E[K];
|
||||
>error : E[K]
|
||||
> : ^^^^
|
||||
|
||||
onError: (data: E[K]) => void;
|
||||
>onError : (data: E[K]) => void
|
||||
> : ^ ^^ ^^^^^
|
||||
>data : E[K]
|
||||
> : ^^^^
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
declare function withTupleLike<T extends { 0: unknown }, E extends { 0: unknown }>(
|
||||
>withTupleLike : <T extends { 0: unknown; }, E extends { 0: unknown; }>(arg: Results<T> & Errors<E>) => [T, E]
|
||||
> : ^ ^^^^^^^^^ ^^ ^^^^^^^^^ ^^ ^^ ^^^^^
|
||||
>0 : unknown
|
||||
> : ^^^^^^^
|
||||
>0 : unknown
|
||||
> : ^^^^^^^
|
||||
|
||||
arg: Results<T> & Errors<E>
|
||||
>arg : Results<T> & Errors<E>
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
): [T, E];
|
||||
|
||||
const res = withTupleLike([
|
||||
>res : [[string, boolean], [number, number]]
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>withTupleLike([ { data: "foo", onSuccess: (dataArg) => { dataArg; }, error: 404, onError: (errorArg) => { errorArg; }, }, { data: true, onSuccess: (dataArg) => { dataArg; }, error: 500, onError: (errorArg) => { errorArg; }, },]) : [[string, boolean], [number, number]]
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
>withTupleLike : <T extends { 0: unknown; }, E extends { 0: unknown; }>(arg: Results<T> & Errors<E>) => [T, E]
|
||||
> : ^ ^^^^^^^^^ ^^ ^^^^^^^^^ ^^ ^^ ^^^^^
|
||||
>[ { data: "foo", onSuccess: (dataArg) => { dataArg; }, error: 404, onError: (errorArg) => { errorArg; }, }, { data: true, onSuccess: (dataArg) => { dataArg; }, error: 500, onError: (errorArg) => { errorArg; }, },] : [{ data: string; onSuccess: (dataArg: string) => void; error: number; onError: (errorArg: number) => void; }, { data: true; onSuccess: (dataArg: boolean) => void; error: number; onError: (errorArg: number) => void; }]
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^
|
||||
{
|
||||
>{ data: "foo", onSuccess: (dataArg) => { dataArg; }, error: 404, onError: (errorArg) => { errorArg; }, } : { data: string; onSuccess: (dataArg: string) => void; error: number; onError: (errorArg: number) => void; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
data: "foo",
|
||||
>data : string
|
||||
> : ^^^^^^
|
||||
>"foo" : "foo"
|
||||
> : ^^^^^
|
||||
|
||||
onSuccess: (dataArg) => {
|
||||
>onSuccess : (dataArg: string) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^
|
||||
>(dataArg) => { dataArg; } : (dataArg: string) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^
|
||||
>dataArg : string
|
||||
> : ^^^^^^
|
||||
|
||||
dataArg;
|
||||
>dataArg : string
|
||||
> : ^^^^^^
|
||||
|
||||
},
|
||||
error: 404,
|
||||
>error : number
|
||||
> : ^^^^^^
|
||||
>404 : 404
|
||||
> : ^^^
|
||||
|
||||
onError: (errorArg) => {
|
||||
>onError : (errorArg: number) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^
|
||||
>(errorArg) => { errorArg; } : (errorArg: number) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^
|
||||
>errorArg : number
|
||||
> : ^^^^^^
|
||||
|
||||
errorArg;
|
||||
>errorArg : number
|
||||
> : ^^^^^^
|
||||
|
||||
},
|
||||
},
|
||||
{
|
||||
>{ data: true, onSuccess: (dataArg) => { dataArg; }, error: 500, onError: (errorArg) => { errorArg; }, } : { data: true; onSuccess: (dataArg: boolean) => void; error: number; onError: (errorArg: number) => void; }
|
||||
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
data: true,
|
||||
>data : true
|
||||
> : ^^^^
|
||||
>true : true
|
||||
> : ^^^^
|
||||
|
||||
onSuccess: (dataArg) => {
|
||||
>onSuccess : (dataArg: boolean) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^^
|
||||
>(dataArg) => { dataArg; } : (dataArg: boolean) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^^
|
||||
>dataArg : boolean
|
||||
> : ^^^^^^^
|
||||
|
||||
dataArg;
|
||||
>dataArg : boolean
|
||||
> : ^^^^^^^
|
||||
|
||||
},
|
||||
error: 500,
|
||||
>error : number
|
||||
> : ^^^^^^
|
||||
>500 : 500
|
||||
> : ^^^
|
||||
|
||||
onError: (errorArg) => {
|
||||
>onError : (errorArg: number) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^
|
||||
>(errorArg) => { errorArg; } : (errorArg: number) => void
|
||||
> : ^ ^^^^^^^^^^^^^^^^^
|
||||
>errorArg : number
|
||||
> : ^^^^^^
|
||||
|
||||
errorArg;
|
||||
>errorArg : number
|
||||
> : ^^^^^^
|
||||
|
||||
},
|
||||
},
|
||||
]);
|
||||
|
|
@ -31,3 +31,15 @@ f2(
|
|||
bar: (value, key) => {},
|
||||
},
|
||||
);
|
||||
|
||||
f2(
|
||||
{
|
||||
foo: 0,
|
||||
bar: "",
|
||||
},
|
||||
{
|
||||
foo: (value, key) => {
|
||||
// implicit `any`s
|
||||
},
|
||||
},
|
||||
);
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
// @strict: true
|
||||
// @noEmit: true
|
||||
|
||||
type ComponentType<P> = (p: P) => any;
|
||||
type ComponentProps<C> = C extends ComponentType<infer P> ? P : never;
|
||||
|
||||
type Attrs<P, A extends Partial<P>> = A;
|
||||
|
||||
interface StyledFunction<
|
||||
C extends ComponentType<any>,
|
||||
O extends object = {},
|
||||
A extends keyof any = never,
|
||||
> {
|
||||
attrs<
|
||||
U,
|
||||
NewA extends Partial<ComponentProps<C> & U> & {
|
||||
[others: string]: any;
|
||||
} = {},
|
||||
>(
|
||||
attrs: Attrs<ComponentProps<C> & U, NewA>,
|
||||
): StyledFunction<C, O & NewA, A | keyof NewA>;
|
||||
}
|
||||
|
||||
interface StyledInterface {
|
||||
<C extends ComponentType<any>>(component: C): StyledFunction<C>;
|
||||
}
|
||||
|
||||
declare const styled: StyledInterface;
|
||||
|
||||
interface BaseProps {
|
||||
as?: "select" | "input";
|
||||
}
|
||||
|
||||
declare const Flex: (props: BaseProps) => null;
|
||||
|
||||
export const StyledSelect = styled(Flex).attrs({
|
||||
as: "select",
|
||||
});
|
|
@ -0,0 +1,38 @@
|
|||
// @strict: true
|
||||
// @noEmit: true
|
||||
|
||||
type IntrinsicElements = {
|
||||
a: {
|
||||
href?: string;
|
||||
};
|
||||
div: {
|
||||
dir?: string;
|
||||
};
|
||||
};
|
||||
|
||||
type Component<Props> = (props: Props) => unknown;
|
||||
|
||||
interface NestedMDXComponents {
|
||||
[key: string]: Component<any>;
|
||||
}
|
||||
|
||||
type MDXComponents = NestedMDXComponents & {
|
||||
[Key in keyof IntrinsicElements]?: Component<IntrinsicElements[Key]>;
|
||||
};
|
||||
|
||||
export interface MDXProps {
|
||||
components?: MDXComponents;
|
||||
}
|
||||
|
||||
declare function MyMDXComponent(props: MDXProps): null;
|
||||
|
||||
MyMDXComponent({
|
||||
components: {
|
||||
a(props) {
|
||||
return null;
|
||||
},
|
||||
div(props) {
|
||||
return null;
|
||||
},
|
||||
},
|
||||
});
|
|
@ -0,0 +1,31 @@
|
|||
// @strict: true
|
||||
// @noEmit: true
|
||||
|
||||
type TypeMap = {
|
||||
str: "a" | "b" | "c";
|
||||
num: 1 | 2 | 3;
|
||||
};
|
||||
|
||||
declare function test1<
|
||||
T extends { [K in keyof TypeMap]: TypeMap[K][] } & { [k: string]: any[] },
|
||||
>(arg: T): T;
|
||||
|
||||
const result = test1({
|
||||
num: [1, 2],
|
||||
str: ["a", "b"],
|
||||
bool: [true, false],
|
||||
});
|
||||
|
||||
declare function test2(a: { type: "foo" | "bar" } & { type: any }): void;
|
||||
|
||||
test2({ type: "foo" });
|
||||
|
||||
// https://github.com/microsoft/TypeScript/issues/59473
|
||||
|
||||
const x: { ml: any } & { ml: 'edge' } = { ml: 'edge' };
|
||||
const a: [any] & [1] = [1];
|
||||
const b: any[] & 1[] = [1, 1];
|
||||
const c: { a: any } & { a: 1 } = { a: 1 };
|
||||
const d: (() => { a: 1 }) & (() => { a: any }) = () => ({
|
||||
a: 1,
|
||||
});
|
|
@ -0,0 +1,52 @@
|
|||
// @strict: true
|
||||
// @noEmit: true
|
||||
|
||||
declare function test1(
|
||||
arg: { a: (arg: number) => void } & { [k: string]: (arg: any) => void },
|
||||
): unknown;
|
||||
|
||||
test1({
|
||||
a: (arg) => {},
|
||||
b: (arg) => {},
|
||||
});
|
||||
|
||||
declare function test2(
|
||||
arg: { a: (arg: { foo: string }) => void } & {
|
||||
[k: string]: (arg: { foo: any }) => void;
|
||||
},
|
||||
): unknown;
|
||||
|
||||
test2({
|
||||
a: (arg) => {},
|
||||
b: (arg) => {},
|
||||
});
|
||||
|
||||
declare function test3(
|
||||
arg: { a: () => "foo" } & {
|
||||
[k: string]: () => any;
|
||||
},
|
||||
): unknown;
|
||||
|
||||
test3({
|
||||
a: () => "foo",
|
||||
b: () => "bar",
|
||||
});
|
||||
|
||||
test3({
|
||||
a: () => "bar",
|
||||
});
|
||||
|
||||
declare function test4(
|
||||
arg: { a: () => { prop: "foo" } } & {
|
||||
[k: string]: () => { prop: any };
|
||||
},
|
||||
): unknown;
|
||||
|
||||
test4({
|
||||
a: () => ({ prop: "foo" }),
|
||||
b: () => ({ prop: "bar" }),
|
||||
});
|
||||
|
||||
test4({
|
||||
a: () => ({ prop: "bar" }),
|
||||
});
|
|
@ -0,0 +1,59 @@
|
|||
// @strict: true
|
||||
// @noEmit: true
|
||||
|
||||
type ComputedGetter<T> = (oldValue?: T) => T;
|
||||
type ComputedOptions = Record<string, ComputedGetter<any>>;
|
||||
|
||||
type ExtractComputedReturns<T extends any> = {
|
||||
[key in keyof T]: T[key] extends (...args: any[]) => infer TReturn
|
||||
? TReturn
|
||||
: never;
|
||||
};
|
||||
|
||||
interface ComponentOptionsBase<D, C extends ComputedOptions> {
|
||||
data?: D;
|
||||
computed?: C;
|
||||
}
|
||||
|
||||
type ComponentPublicInstance<D = {}, C extends ComputedOptions = {}> = D &
|
||||
ExtractComputedReturns<C>;
|
||||
|
||||
type ComponentOptions<
|
||||
D = any,
|
||||
C extends ComputedOptions = any,
|
||||
> = ComponentOptionsBase<D, C> & ThisType<ComponentPublicInstance<D, C>>;
|
||||
|
||||
interface App {
|
||||
mixin(mixin: ComponentOptions): this;
|
||||
}
|
||||
|
||||
interface InjectionKey<T> extends Symbol {}
|
||||
|
||||
interface Ref<T> {
|
||||
_v: T;
|
||||
}
|
||||
|
||||
declare function reactive<T extends object>(target: T): Ref<T>;
|
||||
|
||||
interface ThemeInstance {
|
||||
readonly name: Readonly<Ref<string>>;
|
||||
}
|
||||
|
||||
declare const ThemeSymbol: InjectionKey<ThemeInstance>;
|
||||
|
||||
declare function inject(
|
||||
this: ComponentPublicInstance,
|
||||
key: InjectionKey<any> | string,
|
||||
): any;
|
||||
|
||||
declare const app: App;
|
||||
app.mixin({
|
||||
computed: {
|
||||
$vuetify() {
|
||||
// this is meant to be `any` here
|
||||
return reactive({
|
||||
theme: inject.call(this, ThemeSymbol),
|
||||
});
|
||||
},
|
||||
},
|
||||
});
|
|
@ -0,0 +1,147 @@
|
|||
// @strict: true
|
||||
// @noEmit: true
|
||||
|
||||
// repro from #48812
|
||||
|
||||
type Action<TEvent extends { type: string }> = (ev: TEvent) => void;
|
||||
|
||||
interface MachineConfig<TEvent extends { type: string }> {
|
||||
schema: {
|
||||
events: TEvent;
|
||||
};
|
||||
on?: {
|
||||
[K in TEvent["type"]]?: Action<TEvent extends { type: K } ? TEvent : never>;
|
||||
} & {
|
||||
"*"?: Action<TEvent>;
|
||||
};
|
||||
}
|
||||
|
||||
declare function createMachine<TEvent extends { type: string }>(
|
||||
config: MachineConfig<TEvent>
|
||||
): void;
|
||||
|
||||
createMachine({
|
||||
schema: {
|
||||
events: {} as { type: "FOO" } | { type: "BAR" },
|
||||
},
|
||||
on: {
|
||||
FOO: (ev) => {
|
||||
ev.type; // should be 'FOO'
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
createMachine({
|
||||
schema: {
|
||||
events: {} as { type: "FOO" } | { type: "BAR" },
|
||||
},
|
||||
on: {
|
||||
"*": (ev) => {
|
||||
ev.type; // should be 'FOO' | 'BAR'
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
interface MachineConfig2<TEvent extends { type: string }> {
|
||||
schema: {
|
||||
events: TEvent;
|
||||
};
|
||||
on?: {
|
||||
[K in TEvent["type"] as K extends Uppercase<string> ? K : never]?: Action<TEvent extends { type: K } ? TEvent : never>;
|
||||
} & {
|
||||
"*"?: Action<TEvent>;
|
||||
};
|
||||
}
|
||||
|
||||
declare function createMachine2<TEvent extends { type: string }>(
|
||||
config: MachineConfig2<TEvent>
|
||||
): void;
|
||||
|
||||
createMachine2({
|
||||
schema: {
|
||||
events: {} as { type: "FOO" } | { type: "bar" },
|
||||
},
|
||||
on: {
|
||||
FOO: (ev) => {
|
||||
ev.type; // should be 'FOO'
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
createMachine2({
|
||||
schema: {
|
||||
events: {} as { type: "FOO" } | { type: "bar" },
|
||||
},
|
||||
on: {
|
||||
"*": (ev) => {
|
||||
ev.type; // should be 'FOO' | 'bar'
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
createMachine2({
|
||||
schema: {
|
||||
events: {} as { type: "FOO" } | { type: "bar" },
|
||||
},
|
||||
on: {
|
||||
bar: (ev) => {
|
||||
ev // any
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
// repro from #49307#issuecomment-1143103607
|
||||
|
||||
declare function createSlice<T>(
|
||||
reducers: { [K: string]: (state: string) => void } & {
|
||||
[K in keyof T]: object;
|
||||
}
|
||||
): void;
|
||||
|
||||
createSlice({
|
||||
f(a) {},
|
||||
});
|
||||
|
||||
// repro from #49307#issuecomment-1196014488
|
||||
|
||||
type Validate<T> = T & { [K in keyof T]: object }
|
||||
declare function f<S, T extends Record<string, (state: S) => any>>(s: S, x: Validate<T>): void;
|
||||
|
||||
f(0, {
|
||||
foo: s => s + 1,
|
||||
})
|
||||
|
||||
// repro from 49307#issuecomment-1195858950
|
||||
|
||||
type SliceCaseReducers<State> = Record<string, (state: State) => State | void>;
|
||||
|
||||
type ValidateSliceCaseReducers<S, ACR extends SliceCaseReducers<S>> = ACR & {
|
||||
[T in keyof ACR]: ACR[T] extends {
|
||||
reducer(s: S, action?: infer A): any;
|
||||
}
|
||||
? {
|
||||
prepare(...a: never[]): Omit<A, "type">;
|
||||
}
|
||||
: {};
|
||||
};
|
||||
|
||||
declare function createSlice<
|
||||
State,
|
||||
CaseReducers extends SliceCaseReducers<State>
|
||||
>(options: {
|
||||
initialState: State | (() => State);
|
||||
reducers: ValidateSliceCaseReducers<State, CaseReducers>;
|
||||
}): void;
|
||||
|
||||
export const clientSlice = createSlice({
|
||||
initialState: {
|
||||
username: "",
|
||||
isLoggedIn: false,
|
||||
userId: "",
|
||||
avatar: "",
|
||||
},
|
||||
reducers: {
|
||||
onClientUserChanged(state) {},
|
||||
},
|
||||
});
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
// @strict: true
|
||||
// @noEmit: true
|
||||
|
||||
type IntrinsicElements = {
|
||||
div: {
|
||||
onChange: (ev: Event) => void;
|
||||
};
|
||||
span: {
|
||||
onChange: (ev: Event) => void;
|
||||
};
|
||||
};
|
||||
|
||||
type ElementType = keyof IntrinsicElements;
|
||||
|
||||
let DEFAULT_TABS_TAG = "div" as const;
|
||||
|
||||
type Props<TTag extends ElementType, Overrides = {}> = Omit<
|
||||
IntrinsicElements[TTag],
|
||||
keyof Overrides
|
||||
> &
|
||||
Overrides;
|
||||
|
||||
type TabGroupProps<TTag extends ElementType = typeof DEFAULT_TABS_TAG> = Props<
|
||||
TTag,
|
||||
{
|
||||
defaultIndex?: number;
|
||||
onChange?: (index: number) => void;
|
||||
selectedIndex?: number;
|
||||
vertical?: boolean;
|
||||
manual?: boolean;
|
||||
}
|
||||
>;
|
||||
|
||||
interface _internal_ComponentTabGroup {
|
||||
<TTag extends ElementType = typeof DEFAULT_TABS_TAG>(
|
||||
props: TabGroupProps<TTag>,
|
||||
): null;
|
||||
}
|
||||
|
||||
declare let TabGroup: _internal_ComponentTabGroup;
|
||||
|
||||
TabGroup({
|
||||
defaultIndex: 0,
|
||||
onChange: (index) => {
|
||||
const i: number = index;
|
||||
},
|
||||
});
|
|
@ -0,0 +1,28 @@
|
|||
// @strict: true
|
||||
// @noEmit: true
|
||||
|
||||
type Tags<D extends string, P> = P extends Record<D, infer X> ? X : never;
|
||||
|
||||
declare const typeTags: <I>() => <
|
||||
P extends {
|
||||
readonly [Tag in Tags<"_tag", I> & string]: (
|
||||
_: Extract<I, { readonly _tag: Tag }>,
|
||||
) => any;
|
||||
} & { readonly [Tag in Exclude<keyof P, Tags<"_tag", I>>]: never },
|
||||
>(
|
||||
fields: P,
|
||||
) => unknown;
|
||||
|
||||
type Value = { _tag: "A"; a: number } | { _tag: "B"; b: number };
|
||||
const matcher = typeTags<Value>();
|
||||
|
||||
matcher({
|
||||
A: (_) => _.a,
|
||||
B: (_) => "fail",
|
||||
});
|
||||
|
||||
matcher({
|
||||
A: (_) => _.a,
|
||||
B: (_) => "fail",
|
||||
C: (_) => "fail",
|
||||
});
|
|
@ -0,0 +1,49 @@
|
|||
// @strict: true
|
||||
// @noEmit: true
|
||||
|
||||
type MappedOmit<T, K extends keyof any> = { [P in keyof T as Exclude<P, K>]: T[P]; }
|
||||
|
||||
type IntrinsicElements = {
|
||||
div: {
|
||||
onChange: (ev: Event) => void;
|
||||
};
|
||||
span: {
|
||||
onChange: (ev: Event) => void;
|
||||
};
|
||||
};
|
||||
|
||||
type ElementType = keyof IntrinsicElements;
|
||||
|
||||
let DEFAULT_TABS_TAG = "div" as const;
|
||||
|
||||
type Props<TTag extends ElementType, Overrides = {}> = MappedOmit<
|
||||
IntrinsicElements[TTag],
|
||||
keyof Overrides
|
||||
> &
|
||||
Overrides;
|
||||
|
||||
type TabGroupProps<TTag extends ElementType = typeof DEFAULT_TABS_TAG> = Props<
|
||||
TTag,
|
||||
{
|
||||
defaultIndex?: number;
|
||||
onChange?: (index: number) => void;
|
||||
selectedIndex?: number;
|
||||
vertical?: boolean;
|
||||
manual?: boolean;
|
||||
}
|
||||
>;
|
||||
|
||||
interface _internal_ComponentTabGroup {
|
||||
<TTag extends ElementType = typeof DEFAULT_TABS_TAG>(
|
||||
props: TabGroupProps<TTag>,
|
||||
): null;
|
||||
}
|
||||
|
||||
declare let TabGroup: _internal_ComponentTabGroup;
|
||||
|
||||
TabGroup({
|
||||
defaultIndex: 0,
|
||||
onChange: (index) => {
|
||||
const i: number = index;
|
||||
},
|
||||
});
|
|
@ -0,0 +1,28 @@
|
|||
// @strict: true
|
||||
// @jsx: react
|
||||
// @esModuleInterop: true
|
||||
// @noEmit: true
|
||||
|
||||
/// <reference path="/.lib/react16.d.ts" />
|
||||
|
||||
import React from "react";
|
||||
import { ComponentPropsWithRef, ElementType } from "react";
|
||||
|
||||
function UnwrappedLink<T extends ElementType = ElementType>(
|
||||
props: Omit<ComponentPropsWithRef<ElementType extends T ? "a" : T>, "as">,
|
||||
) {
|
||||
return <a></a>;
|
||||
}
|
||||
|
||||
<UnwrappedLink onClick={(e) => {}} />;
|
||||
|
||||
function UnwrappedLink2<T extends ElementType = ElementType>(
|
||||
props: Omit<ComponentPropsWithRef<ElementType extends T ? "a" : T>, "as"> & {
|
||||
as?: T;
|
||||
},
|
||||
) {
|
||||
return <a></a>;
|
||||
}
|
||||
|
||||
<UnwrappedLink2 onClick={(e) => {}} />;
|
||||
<UnwrappedLink2 as="button" onClick={(e) => {}} />;
|
|
@ -0,0 +1,43 @@
|
|||
// @strict: true
|
||||
// @noEmit: true
|
||||
|
||||
type Results<T> = {
|
||||
[K in keyof T]: {
|
||||
data: T[K];
|
||||
onSuccess: (data: T[K]) => void;
|
||||
};
|
||||
};
|
||||
|
||||
type Errors<E> = {
|
||||
[K in keyof E]: {
|
||||
error: E[K];
|
||||
onError: (data: E[K]) => void;
|
||||
};
|
||||
};
|
||||
|
||||
declare function withKeyedObj<T, E>(
|
||||
arg: Results<T> & Errors<E>
|
||||
): [T, E];
|
||||
|
||||
const res = withKeyedObj({
|
||||
a: {
|
||||
data: "foo",
|
||||
onSuccess: (dataArg) => {
|
||||
dataArg;
|
||||
},
|
||||
error: 404,
|
||||
onError: (errorArg) => {
|
||||
errorArg;
|
||||
},
|
||||
},
|
||||
b: {
|
||||
data: true,
|
||||
onSuccess: (dataArg) => {
|
||||
dataArg;
|
||||
},
|
||||
error: 500,
|
||||
onError: (errorArg) => {
|
||||
errorArg;
|
||||
},
|
||||
},
|
||||
});
|
|
@ -0,0 +1,43 @@
|
|||
// @strict: true
|
||||
// @noEmit: true
|
||||
|
||||
type Results<T> = {
|
||||
[K in keyof T]: {
|
||||
data: T[K];
|
||||
onSuccess: (data: T[K]) => void;
|
||||
};
|
||||
};
|
||||
|
||||
type Errors<E> = {
|
||||
[K in keyof E]: {
|
||||
error: E[K];
|
||||
onError: (data: E[K]) => void;
|
||||
};
|
||||
};
|
||||
|
||||
declare function withTupleLike<T extends { 0: unknown }, E extends { 0: unknown }>(
|
||||
arg: Results<T> & Errors<E>
|
||||
): [T, E];
|
||||
|
||||
const res = withTupleLike([
|
||||
{
|
||||
data: "foo",
|
||||
onSuccess: (dataArg) => {
|
||||
dataArg;
|
||||
},
|
||||
error: 404,
|
||||
onError: (errorArg) => {
|
||||
errorArg;
|
||||
},
|
||||
},
|
||||
{
|
||||
data: true,
|
||||
onSuccess: (dataArg) => {
|
||||
dataArg;
|
||||
},
|
||||
error: 500,
|
||||
onError: (errorArg) => {
|
||||
errorArg;
|
||||
},
|
||||
},
|
||||
]);
|
Загрузка…
Ссылка в новой задаче