Issue
Is there a way to force excess-property checking to happen, not just for an inlined object literal but one that derives from a variable?
For example, suppose I have an interface and a function
interface Animal {
speciesName: string
legCount: number,
}
function serializeBasicAnimalData(a: Animal) {
// something
}
If I call
serializeBasicAnimalData({
legCount: 65,
speciesName: "weird 65-legged animal",
specialPowers: "Devours plastic"
})
I would get an error -- which for my situation, is what I want. I only want the function to take in a generic animal description without extra specifics.
On the other hand, if I first create a variable for it, I don't get the error:
var weirdAnimal = {
legCount: 65,
speciesName: "weird 65-legged animal",
specialPowers: "Devours plastic"
};
serializeBasicAnimalData(weirdAnimal);
So my question is: Is there a way to somehow force TypeScript to apply "excess property checking" to the function parameter irrespective of whether it's an inlined object or an object that has previously been assigned to a variable?
Solution
Hope this helps, this will cause it to fail. The underlying cause here is Typescripts reliance on structural typing which is alot better than the alternative which is Nominal typing but still has its problems.
type StrictPropertyCheck<T, TExpected, TError> = Exclude<keyof T, keyof TExpected> extends never ? {} : TError;
interface Animal {
speciesName: string
legCount: number,
}
function serializeBasicAnimalData<T extends Animal>(a: T & StrictPropertyCheck<T, Animal, "Only allowed properties of Animal">) {
// something
}
var weirdAnimal = {
legCount: 65,
speciesName: "weird 65-legged animal",
specialPowers: "Devours plastic"
};
serializeBasicAnimalData(weirdAnimal); // now correctly fails
Answered By - Shanon Jackson
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.