gpt4 book ai didi

typescript : avoid extra properties

转载 作者:行者123 更新时间:2023-12-04 11:23:45 28 4
gpt4 key购买 nike

感谢您查看我的 typescript 问题。

为简单起见,我对 typescript “过度属性检查”行为有疑问。我想确保 TypeScript 不接受具有额外属性的对象。

在我的简单界面示例中,OFC 我可以简单地选择可用数据,但我有很多属性,我想避免在运行时过滤它们,有没有办法?

在这里您可以找到我为此主题制作的示例代码:

TypeScript Playground

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;

提前致谢 <3

最佳答案

听起来你想要一个 Exact类型。 typescript 没有附带,但很容易制作:

type Exact<A, B> = A extends B
? B extends A
? A
: never
: never

这基本上是说如果和 A extends BB extends A那么类型是相同的,既不是另一个的子集也不是超集。所以它应该允许该类型通过。如果它们不相同,则类型为 never这会阻止该类型被允许。

现在你只需要让你的函数通用,并将该参数强制为正确的类型:
function func<T>(param: Exact<T, LayoutType>) {
console.log(param);
}
func(badData)
// Argument of type '{ margin: number; padding: number; }'
// is not assignable to parameter of type 'never'.

Playground

更多相关阅读请见 Typescript issue #12936

最后,对象字面量不起作用而对象变量起作用的原因是该字面量是为特定类型构造的。 Typescript 无法知道额外的属性,因为这些属性没有类型信息。所以 typescript 程序不能使用这些属性,因为它们没有被声明为存在。

然而,当对象是一个变量并且额外的属性是已知的,那么它是一个独立但兼容的类型。额外的属性不能用在只接受窄类型的函数中,但在其他知道更宽类型的代码中可以使用这些属性。

这就是为什么这是有效的:
const obj1 = { a: 1, b: 2 }
const obj2: { a: number } = obj1

console.log(obj1.b) // b can still be accessed

但这不是:
const obj1: { a: number } = { a: 1, b: 2 }
// ^ type error

关于 typescript : avoid extra properties,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61960321/

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