gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:41:42 26 4
gpt4 key购买 nike

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com