我对TypeScript的“Excess Property Checks”行为有一个问题。我想确保具有额外属性的对象不会被TypeScript接受。
在我的简单接口的例子中,我可以简单地选择可用的数据,但我有很多属性,我想避免在运行时过滤它们,有办法吗?
type LayoutType {
margin: number;
}
const badData = {
margin: 23,
padding: 23,
}
function func(param: LayoutType) {
console.log(param);
// Here I want to use property being sure param only contains LayoutType property
}
// OK
func({ margin: 42 })
// OK : padding is detected as unwanted property
func({ margin: 42, padding: 32 })
// KO : bad data shouldn't fit
func(badData)
/* SAME */
// OK : padding is detected as unwanted property
const test1: LayoutType = { margin: 42, padding: 32 };
// KO : bad data shouldn't fit
const test2: LayoutType = badData;
操场
2条答案
按热度按时间x9ybnkn61#
听起来你想要一个
Exact
类型。Typescript不附带一个,但它很容易制作:这基本上是说,如果和
A extends B
* 和 *B extends A
那么类型是相同的,既不是另一个的子集或超集。所以它应该允许这种类型通过。如果它们不相同,则类型为never
,这将阻止该类型被允许。现在,你只需要让你的函数成为泛型,并将该参数强制为正确的类型:
操场
更多相关阅读请参见Typescript issue #12936
最后,对象文字不起作用而对象变量起作用的原因是文字是为特定类型构造的。Typescript无法知道额外的属性,因为这些属性没有类型信息。因此,类型脚本程序不能使用这些属性,因为它们没有被声明为存在。
然而,当对象是一个变量,并且额外的属性是已知的,那么它就是一个独立但兼容的类型。在只接受窄类型的函数中可能不会使用额外的属性,但在其他知道更宽类型的代码中,可以使用属性。
这就是为什么这是有效的:
但这不是:
eivnm1vs2#
的原因
不起作用,但是
这是因为TypeScript中的“过度属性检查”: