TypeScript 为扩展操作添加替代方案,以执行浅层过度属性检查,

mnowg1ta  于 5个月前  发布在  TypeScript
关注(0)|答案(2)|浏览(48)

搜索词

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 的其他部分保持一致。
irlmq6kh

irlmq6kh1#

看起来#12936可以解决这个问题以及其他许多问题。

kulphzqa

kulphzqa2#

同意。作为一个之前使用Flow的用户,我一直(默默地)坚持寻找精确类型已有几年了,如果能找到一种增量路径,让我们能够更快地获得一些价值,而不是等待所有#12936都被完善,那就太好了。这个提案在语法方面也可能提供一个先例,例如:“由于extends!使用了!,精确类型可以是!{ a: number; b: string; }”。

相关问题