gpt4 book ai didi

typescript - 如何限制给定参数装饰器可以应用于的参数类型

转载 作者:行者123 更新时间:2023-12-02 10:46:06 24 4
gpt4 key购买 nike

当前有一种方法可以限制可以应用给定属性装饰器的属性类型。例如。

type PropertyDecorator<TPropType = unknown> = (
<
TPropName extends string | symbol,
TProtoOrClass extends Record<TPropName, TPropType>
>
(protoOrClass: TProtoOrClass, propName: TPropName) => void
);

function boolPropertyDecorator(): PropertyDecorator<boolean> {
return () => {};
}

class Foo {
// compile-time error "Type 'number' is not assignable to type 'boolean'"
@boolPropertyDecorator()
prop!: number;

}

但是我无法为方法参数修饰符利用这种类型检查。
type ParameterDecorator<TParamType = unknown> = (
<
TMethodName extends string | symbol,
TParamIndex extends number,
TProtoOrClass extends Record<
TMethodName,
(this: TProtoOrClass, ...args: unknown[] & Record<TParamIndex, TParamType>) => unknown
>

>
(
protoOrClass: TProtoOrClass,
methodName: TMethodName,
parameterIndex: TParamIndex
) => void
);


function numberParameterDecorator(): ParameterDecorator<number> {
return () => {};
}

class Foo {
// no decorator-related error message is generated, but should!
method(@numberParameterDecorator() str: string) {}
}

我不能确定为什么会这样。它是带有参数修饰符的TypeScript错误吗?为什么没有错误信息?它与消除单位类型(例如 TParamIndexTParamName)有某种关系吗?

最佳答案

您的假设是TMethodNameTParamIndex根据使用情况推断为其文字类型版本。不幸的是,它们不是用于参数修饰符的(对于方法修饰符,方法名称的确会推断为方法名称的字符串文字,因此,在处理它们的方式上至少是不一致的)。

周围有一个GitHub issue,我什至有一个版本的 typescript 编译器代码可以解决这个问题,但是不幸的是,目前团队似乎并没有考虑这个问题。

优先级也会根据反馈而变化,因此可以随意提出意见,或者对您的用例发表评论,因为这将帮助团队看到确实有此需要。

关于typescript - 如何限制给定参数装饰器可以应用于的参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55144265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com