有没有办法强制进行过度属性检查,不仅针对内联对象字面量,而且针对从变量派生的对象字面量?
例如,假设我有一个接口(interface)和一个函数
interface Animal {
speciesName: string
legCount: number,
}
function serializeBasicAnimalData(a: Animal) {
// something
}
如果我打电话
serializeBasicAnimalData({
legCount: 65,
speciesName: "weird 65-legged animal",
specialPowers: "Devours plastic"
})
我会得到一个错误——就我的情况而言,这正是我想要的。我只希望函数接受没有额外细节的通用动物描述。
另一方面,如果我首先为它创建一个变量,我不会得到错误:
var weirdAnimal = {
legCount: 65,
speciesName: "weird 65-legged animal",
specialPowers: "Devours plastic"
};
serializeBasicAnimalData(weirdAnimal);
所以我的问题是:有没有办法以某种方式强制 TypeScript 对函数参数应用“多余属性检查”,而不管它是内联对象还是之前已分配给变量的对象?
最佳答案
希望这会有所帮助,这将导致它失败。这里的根本原因是 Typescript 对结构类型的依赖,这比标称类型的替代方案要好得多,但仍然存在问题。
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
关于typescript - 强制对传递给 TypeScript 函数的变量进行过度属性检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54775790/