当TypeScript检查提供的属性是否与给定类型匹配时,它会将破折号属性从像索引签名这样的东西中排除。
import React from 'react';
interface Props {
[prop: string]: number;
}
function MyComponent(x: Props) {
return <div />
}
// No error.
<MyComponent foo-bar={"hello"} />
这适用于所有索引签名,即使是匹配的字符串模式索引签名。
import React from 'react';
interface Props {
[prop: `data-${string}`]: number;
}
function MyComponent(x: Props) {
return <div />
}
// No error.
<MyComponent data-bar={"hello"} />
在新的 --strict
模式标志下,这些属性将在存在索引签名的情况下进行严格检查。
这个问题是 #44797 的可能替代方案。这个提案中的建议是,通过一个新的严格模式标志来加强对所有索引签名的检查,而不是针对特定的一组索引签名进行验证。
✅ 可实施性检查清单
我的建议满足以下准则:
- 这不会对现有的TypeScript/JavaScript代码造成破坏性的更改
- 对于
--strict
模式的用户来说,这是必要的。 - 这不会改变现有JavaScript代码的运行时行为
- 可以在不根据表达式的类型发出不同的JS的情况下实现这一点
- 这不是一个运行时特性(例如库功能、JavaScript输出的非ECMAScript语法、JS的新语法糖等)
- 这个特性将与其他 TypeScript's Design Goals 保持一致。
💻 用例
模板字符串类型的一个激励性示例是对象类型的索引模式。这在与Fluent UI库作者的讨论中特别提到过,但这种检查并不完全适用于JSX属性,这似乎是个不幸的意外。
1条答案
按热度按时间7cwmlq891#
我认为我们需要在这里进行一些实验。欢迎PR,但是团队对于这个带来的价值与潜在的破坏以及另一个标志的开销有些分歧。因此,即使结果只是轻微的好(即,这个捕获了一些合法的bug),我们可能也不会合并那个PR。