Как ограничить тип параметра, к которому может быть применен данный декоратор параметров - PullRequest
1 голос
/ 13 марта 2019

В настоящее время существует способ ограничения типа свойства, к которому может быть применен данный декоратор свойства. Э.Г.

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)?

1 Ответ

1 голос
/ 13 марта 2019

Вы предполагаете, что TMethodName и TParamIndex выводятся в своих версиях литерального типа в зависимости от использования.К сожалению, они не подходят для декораторов параметров (для декораторов методов имя метода действительно выводится в строковый литерал имени метода, так что это, по крайней мере, противоречие в способе их обработки).

В связи с этим существует проблема GitHub , у меня даже есть версия кода компилятора машинописи, которая могла бы решить эту проблему, но, к сожалению, она не кажется приоритетной вмомент для команды, чтобы включить это.

Приоритеты также меняются в зависимости от обратной связи, поэтому не стесняйтесь сообщить о проблеме, возможно, прокомментируйте ваш вариант использования, поскольку это поможет команде понять, что в этом действительно есть необходимость.

...