【发布时间】:2021-01-04 00:03:58
【问题描述】:
我用 TypeScript 输入这个:
const k = {
container: {
width: '100%',
},
}
当我使用智能感知时,TypeScript 发现我的对象 k 有一个名为 container 的属性似乎很酷。它工作正常。现在,我想限制属性的值,所以我声明了一个接口:
interface StyleSet {
[key: string]: React.CSSProperties
}
现在我将类型添加到前一个对象,所以我们有:
const k: StyleSet = {
container: {
width: '100%',
},
}
一切正常。现在智能感知可以识别,TypeScript 强制对象 k hare 类型为 React.CSSProperties 的属性值。
但是,问题来了,现在智能感知(和 TypeScript!?)不再识别我的 k 对象中的属性名称。即当我输入k. 时,它并没有建议(并且似乎忽略)我之后输入的内容。所以我可以输入 k.potatoe 并毫无问题地使用该值(当然,该值是 undefined / null )但 TypeScript 不再提示任何错误。
问题:如何告诉 TypeScript,属性的值都是 React.CSSProperties 类型,但是当我使用对象时,仍然限制属性的名称?也就是说,我只能输入k.container。
我在网上搜索了大量关于 TypeScript 的文档和示例,但似乎这是不可能的。我尝试了接口、类型、记录、只读...
请注意,对象的键是未知的。例如,一个可能是:
const a: StyleSet = {
potato:{
width: '100%',
},
}
而另一个对象可能是:
const b: StyleSet = {
ketchup: {
width: 'auto',
},
}
另请注意,对此有部分解决方案,使用ReturnType TypeScript 可以做我想做的事,但我需要将每个对象包装在一个函数中。我也觉得这很荒谬。
欢迎任何想法:)
【问题讨论】:
标签: typescript typescript-typings