TypeScript 对于非实验性装饰器类型的改进

sbtkgmzw  于 6个月前  发布在  TypeScript
关注(0)|答案(4)|浏览(48)

🔍搜索词

github typescript decorator value type

✅可行性检查清单

⭐建议

这是一个要求添加一个新的实用类型的请求,因为TypeScript为装饰器上下文添加了一个,但没有为值添加一个
DecoratorContext 类型对于捕获所有上下文类型来说是很好的:

function decorator(value: unknown, context: DecoratorContext) { // optionally use a more specific type.
  // ...
}

但是对于 value ,没有一个很好的捕获所有类型的类型。

📃动机示例

如果我们有一个上下文捕获所有类型,为什么不也有一个值捕获所有类型,例如:

export type DecoratedValue = Constructor | Function | ClassAccessorDecoratorTarget<object, unknown> | undefined

💻用例

  1. 你打算用这个做什么?处理任何值类型的装饰器代码
  2. 目前方法的缺点是什么?我们需要自己为值制作捕获所有类型,但我们不需要为上下文这样做
  3. 在这段时间内你正在使用什么解决方法?我制作自己的捕获所有类型(不是那么大的问题,但我自己制作 DecoratorContext 也不是什么大事)
rseugnpd

rseugnpd1#

这不是要求添加一个新的实用程序类型:https://github.com/microsoft/TypeScript/wiki/No-New-Utility-Types
但从技术上讲,它是。

to94eoyn

to94eoyn2#

在进行这个操作时,是否可以引入以下内容?

function isMemberDecorator(o: DecoratorContext): o is ClassMemberDecorator

因为:

我们必须这样做:

编辑:哦,等等,TypeScript 是否甚至提供了任何类型保护?
装饰器返回类型很棘手。似乎没有任何内置类型可以使用。例如,我希望有类似 FieldInitializer 的:

function fieldDeco(value: unknown, context: ClassFieldDecoratorContext): FieldInitializer | void

Etc 对于其他返回类型。还有一种通配符:

type DecoratorReturn = FieldInitializer | etc
8ljdwjyq

8ljdwjyq3#

顺便说一下,我不认为 DecoratedValue 算作通常意义上的“实用类型”;检查表中的这个点通常指的是请求类似于 PartialOmit 类型的请求,目的是操作其他类型(即实用类型 = 类型实用)。我认为这里要求的不再是一个实用类型,就像 ArrayBufferLike 一样。
当然,是否会有TS维护者想要添加可以直接用联合体表示的新命名类型还不确定。但这个决定可能比通常对实用类型的一刀切禁令更务实。

vjrehmav

vjrehmav4#

哦,等等,TypeScript甚至没有提供任何类型保护吗?
不,而且它不太可能有。除了像enum这样的传统特性之外,TS不会在运行时执行任何操作。因此,在这个清单的这一点上
这不是一个运行时特性(例如库功能、JavaScript输出的非ECMAScript语法、JS的新语法糖等)
类型保护必须已经指定在ECMAScript中(因此由JS引擎提供)或者来自外部库。

相关问题