reactjs - 如何让 TypeScript 对 React 道具中的扩展运算符进行类型检查?
问题描述
此代码在 TS 中正确标记:
<MyComponent nonexistentProp="foo" />
此代码不是:
<MyComponent { ...{ nonexistentProp: "foo" }} />
TS 检查不正确的 props 没有被传入似乎微不足道 - 我们如何启用此检查以确保我们传入了预期的 props?
解决方案
我怀疑这种类型检查受到与常规 TypeScript 代码相同的约束:
interface Contract {
a: string;
}
const allowed: Contract = {
a: "bc",
};
const notAllowed: Contract = {
a: "bc",
b: "dc",
};
const aboutToBeAllowed = {
a: "bc",
b: "dc",
};
const alsoAllowed: Contract = aboutToBeAllowed;
这里显示的问题是 TypeScript 有它的局限性,因为它是一个结构化类型系统。
它只能在对象字面量赋值期间强制执行我们人类认为它应该在所有情况下执行的约束(请参阅notAllowed
赋值)。
这种alsoAllowed
情况与变体基本相同notAllowed
,但它有效。这是因为匿名对象满足Contract
约束。
同样,在您的 TSX 示例中,这与常规 TypeScript 的行为基本相同:
interface Props { a: string; };
const MyComponent: React.SFC<Props> = (props) => <div />;
const myCompOk1 = <MyComponent a="ab" />;
const myCompBad1 = <MyComponent a="ab" b="cd" />;
const anonPropsNoExtra = { a: "bc" };
const myCompOk2 = <MyComponent {...anonPropsNoExtra} />;
const anonPropsWithExtra = { a: "bc", b: "cd" };
const myCompOk3 = <MyComponent {...anonPropsWithExtra} />;
我不相信它有可能以您正在寻找的方式执行它
推荐阅读
- r - R:如何修改槽的值?
- ios - 自定义 UINavigationBar 不尊重给定的高度
- python - 为什么 pandas read_csv 只返回前 1024 列?
- sql - SQL Group By 在某个时间范围内
- ruby-on-rails - 如何使用 shoulda-matchers gem 测试 rspec 中的关联?
- apache-kafka - cassandra中json数据插入的kafka-cassandra-sink错误
- prestashop - 将 Google Ads 转换代码段添加到 Prestashop
- android-studio - Android Studio 中的初始错误。怎么修?
- jenkins - 如何将 Groovy 配置中设置的值覆盖为 Jenkins 构建参数中的值
- typo3 - 为 TYPO3 8.7 配置 HTTP 代理