В настоящее время существует способ ограничения типа свойства, к которому может быть применен данный декоратор свойства. Э.Г.
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 с декораторами параметров? Почему нет сообщения об ошибке? Это как-то связано с уничтожением типов юнитов (например, TParamIndex
или TParamName
)?