搜索词
excess property check exact strict extends
建议
我建议实现一个 extends!
操作符,用于进行过多属性检查。
用例
我特别希望这个操作符能用在 testing types 上。这对于像 expectTypeOf<{a: 1, b: 1}>().toBeAssignableTo<{a?: 1}>();
这样的情况会很有帮助。
此外,对于 React 组件的属性类型检查,TypeScript 也使用了过多属性检查:
<Component propExists propDoesntExist />
^^^^^^^^^^^^^^^
,所以仅仅检查 Props extends React.ComponentProps<Component> ? true : false
是无法确定在这种情况下 TypeScript 会给出类型错误的。目前我的做法是类似于:
Props extends React.ComponentProps<Component>
? keyof Props extends keyof React.ComponentProps<Component>
? true
: false
: false;
。
示例
// `true`
type Example1 = {a: 1, b: 1} extends {a?: 1} ? true : false;
// `false`
type Example2 = {a: 1, b: 1} extends! {a?: 1} ? true : false;
// `true`
type Example3 = {a: 1} extends! {a?: 1} ? true : false;
// Type 'keyof T' cannot be used to index type 'U'.(2536)
type Example1<T, U> = T extends U ? U[keyof T] : never;
^^^^^^^
// Okay
type Example2<T, U> = T extends! U ? U[keyof T] : never;
检查清单
我的建议满足以下准则:
- 这不会对现有的 TypeScript/JavaScript 代码造成破坏性改变
- 这不会改变现有 JavaScript 代码的运行时行为
- 这可以在不根据表达式的类型生成不同 JS 的情况下实现
- 这不是一个运行时特性(例如库功能、带有 JavaScript 输出的非 ECMAScript 语法等)
- 这个特性将与 TypeScript's Design Goals 的其他部分保持一致。
2条答案
按热度按时间irlmq6kh1#
看起来#12936可以解决这个问题以及其他许多问题。
kulphzqa2#
同意。作为一个之前使用Flow的用户,我一直(默默地)坚持寻找精确类型已有几年了,如果能找到一种增量路径,让我们能够更快地获得一些价值,而不是等待所有#12936都被完善,那就太好了。这个提案在语法方面也可能提供一个先例,例如:“由于
extends!
使用了!
,精确类型可以是!{ a: number; b: string; }
”。