Basically, why does Typescript's inference not generate an error in the second example here:
type MyType<TRecord extends Record<string,any>> = {
rec: TRecord
rec2: TRecord
}
const myRec = { idFoo: 3 }
function createMyType<T extends MyType<Record<string,any>>>(obj: T):T {
return obj
}
const myType = createMyType({
rec: myRec,
rec2: 3, // <-- error here as expected
})
const myType2 = createMyType({
rec: myRec,
rec2: {}, // <-- no error here
})
In other words, why doesn't it realize that the generic parameter in createMyType
doesn't actually satisfy the constraint because rec
and rec2
aren't the same type? Or am I misunderstanding how the inference here is working (probably).
Clarification
Another way to ask this might be -- how can I type MyType
or createMyType
so that an error is noted in the second example because rec
and rec2
are not the same type (TRecord
)?
CodePudding user response:
Your problem is where you are scoping T
. Try this, where T
is set to the common type instead of the overall type:
function createMyType<T extends Record<string,any>>(obj: MyType<T>): MyType<T> {
return obj
}
In your previous example, T
is valid if it extends the contract {rec: Record<string, any>, rec2: Record<string, any>}
. Well, {rec: {idFoo: number}, rec2: {}}
does satisfy that contract.
With this change both uses will error.
CodePudding user response:
are you using the non-strict mode?
(This setting is defined in the tsconfig.json file)