TypeScript 在类型Assert/泛型约束中声明泛型并重用

fdx2calv  于 4个月前  发布在  TypeScript
关注(0)|答案(1)|浏览(54)

搜索词

通用,类型Assert,缩小范围,约束,重用

建议

type Fn<T> = (subject: T) => void

const boolFn = fn as (<T extends boolean>Fn<T>)

// or a less flexible, but easier approach
const boolFn = fn as Fn<T extends boolean>

今天没有办法做到这一点。
以下操作不起作用:

declare type boolFn<T extends boolean> = Fn<T>
const boolFn = fn

当前的解决方法是重新声明或组合基本函数:

const boolFn = function <T extends boolean>(subject: T) { return fn(subject) }

这将不必要地增加代码的大小。

使用案例

在某些情况下,函数的功能仅在它们的类型上有所不同。
为了在TypeScript中提供最佳体验,
我想创建一些这些函数的常见变体,但使用相同的底层函数来保持实际代码大小较小。
这里有一个简单的示例 type-plus :

export namespace assertType {
  export type Fn<T> = (subject: T) => void
}

export function assertType<T>(subject: T) { return }

assertType.isUndefiend = assertType as assertType.Fn<undefined> // ok
assertType.isBoolean = assertType as (<T extends boolean = boolean>assertType.Fn<T>) // propose

// usage
let subject: boolean | string = ...
assertType.isBoolean<false>(subject)

这个提案允许更好地重用泛型类型并提供更好的组合。
它还缩小了能够对函数进行类型和对变量进行类型的能力之间的差距。

检查清单

我的建议满足以下准则:

  • 这不会对现有的TypeScript/JavaScript代码造成破坏性的更改
  • 这不会改变现有JavaScript代码的运行时行为
  • 这可以在不根据表达式的类型发出不同的JS的情况下实现
  • 这不是一个运行时特性(例如库功能、带有JavaScript输出的非ECMAScript语法等)
  • 这个特性将与 TypeScript's Design Goals 的其他部分一致。
im9ewurl

im9ewurl1#

这与/#17574中提议的功能相关/子集,用于反馈等待目的:)

相关问题