typescript - 强制对传递给 TypeScript 函数的变量进行过度属性检查

标签 typescript

有没有办法强制进行过度属性检查,不仅针对内联对象字面量,而且针对从变量派生的对象字面量?

例如,假设我有一个接口(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/

相关文章:

javascript - 错误解析触发器 : Cannot find module

angular - 如何在组件中测试FormGroupDirective?

javascript - Angular - 从服务发送请求比从组件发送请求更好?

javascript - 使用事件监听器调用服务

typescript - 使用 Angular 2 连接 Google Maps Nativescript 插件

javascript - 如何过滤由 Javascript/typescript 中的目录选择器选择的 FileList 对象?

Angular2,包含组件模块而不是单独包含所有组件

javascript - 如何使用 DatePipe 在 Angular 4、5、6 及更高版本中获取日期和时间

angular - AG-Grid 与 Angular2。在 angular2 项目中安装 ag-grid 时出错

javascript - 从共享消息服务触发事件以更改组件的内容