有没有一种方法可以强制进行超属性检查,而不仅仅是对内联对象文字进行检查,而是从变量派生?
例如,假设我有一个接口和一个函数
interface Animal {
speciesName: string
legCount: number,
}
function serializeBasicAnimalData(a: Animal) {
// something
}
Run Code Online (Sandbox Code Playgroud)
如果我打电话
serializeBasicAnimalData({
legCount: 65,
speciesName: "weird 65-legged animal",
specialPowers: "Devours plastic"
})
Run Code Online (Sandbox Code Playgroud)
我会得到一个错误-对于我的情况,这就是我想要的。我只希望函数接受通用的动物描述,而无需额外的细节。
另一方面,如果我首先为其创建变量,则不会收到错误消息:
var weirdAnimal = {
legCount: 65,
speciesName: "weird 65-legged animal",
specialPowers: "Devours plastic"
};
serializeBasicAnimalData(weirdAnimal);
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:是否有一种方法可以强制TypeScript对函数参数应用“多余的属性检查”,而不管它是内联对象还是先前已分配给变量的对象?
Sha*_*son 15
希望这会有所帮助,这将导致它失败。造成这种情况的根本原因是Typescripts依赖于结构化类型,这比名义类型化要好得多,但仍然存在问题。
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
287 次 |
| 最近记录: |