强制对传递给TypeScript函数的变量执行多余的属性检查

强制对传递给TypeScript函数的变量执行多余的属性检查,typescript,Typescript,有没有一种方法可以强制执行多余的属性检查,不仅仅是对内联对象文字,而是对从变量派生的对象文字 例如,假设我有一个接口和一个函数 interface Animal {     speciesName: string     legCount: number, } function serializeBasicAnimalData(a: Animal) {     // something } 如果我打电话 serializeBasicAnimalData({     legCount: 65

有没有一种方法可以强制执行多余的属性检查,不仅仅是对内联对象文字,而是对从变量派生的对象文字

例如,假设我有一个接口和一个函数

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对函数参数应用“多余的属性检查”,而不管它是内联对象还是之前分配给变量的对象


希望这有帮助,这将导致它失败。这里的根本原因是类型脚本依赖于结构类型,这比使用名义类型要好得多,但仍然存在问题

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
键入StrictPropertyCheck=从不排除扩展?{}:恐怖;
界面动物{
speciesName:string
legCount:数字,
}
函数序列化BasicAnimalData(a:T&StrictPropertyCheck){
//某物
}
变种怪兽={
立法人数:65,
物种名称:“奇怪的65条腿的动物”,
特殊动力:“吞噬塑料”
};
序列化基本动物数据(古怪动物);//现在正确地失败了

我需要它来在Redux中强制执行对象形状

我将这篇伟大的文章中的答案和香农在这篇文章中的答案结合起来。我认为这提供了一种更简洁的实现方法:

导出类型StrictPropertyCheck=T扩展预期
? 排除从不扩展
? T
:恐怖
:t预期
这里^^我把
T extensed TExpected
放在
StrictPropertyCheck
中,这实际上就是所有的区别,但我认为链接上面的文章会帮助其他人登录到这个线程

redux操作创建者的用法:
导出类型凭据={
电子邮件:string
密码:string
}
导出类型StrictCreds=T&
严格属性检查<
T
资格证书
'错误:凭据对象中有多余的属性'
>
导出类型AuthActionType=
| {
类型:AuthAction.LOGIN
有效载荷:StrictCreds
}
|{type:authoction.LOGOUT
export-const-login=(凭据:StrictCreds):AuthActionType=>{
返回{
类型:AuthAction.LOGIN,
有效负载:凭据作为凭据,
}
}

是的,我可能会在SEC发布一个解决方案。这感觉像是很神奇的,我自己也不认为我能给出这样的答案,但它仍然很棒。非常感谢!名义打字也有它的位置;它不是简单到一个比另一个更好。谢谢。你知道有没有更容易/更易读的方法吗2020年如何做到这一点?