【发布时间】:2017-10-09 16:13:07
【问题描述】:
我经常发现我想声明一个常量对象是某种广泛的类型,以便编译器可以检查初始化。但是当我 使用 那个对象时,我想使用特定的 inferred 类型。如果我为它声明一个类型,我将无法访问对象的推断类型。示例:
电子表格由指向 CSS 属性集合的字符串组成。初始化电子表格时,我想强制每个样式的成员都是 CSS 属性。所以:
type MyStyleDeclaration<K extends string = string> = { [key in K]: CSSProperties }
const myStyleSheet:MyStyleDeclaration {
aStyle: { margin: 4 }
}
这会强制我的 CSS 属性 margin 存在,但如果我以后愚蠢地尝试访问
myStyleSheet.notAStyle
编译器不知道有什么问题 - 键可以是任何字符串。
另一方面,如果我不声明myStyleSheet 的类型,编译器将正确检测到像myStyleSheet.notAStyle 这样的错误引用。如果我将 myStyleSheet 传递给一个通用函数,声明为 MyStyleDeclaration<K>,K 将被正确推断为只是对象中的键。
当然,现在编译器不会检测到任何错误:
const myStyleSheet {
aStyle: { notAProperty: 4 }
}
有什么方法可以让我的蛋糕也吃吗?
【问题讨论】:
标签: typescript type-inference inferred-type