Ошибка компилятора параметризованного типа или правильная программа?

#typescript #type-parameter

Вопрос:

Я удивлен, что эта программа компилируется. Я бы подумал strLengthOne , что строка объявления/инициализации будет помечена как ошибка типа. Не следует ли T описывать разные типы для двух разных видов использования? Один-тип, содержащий один элемент "^...$" , а другой-тип, содержащий один элемент "^.$" ? Или я неправильно понимаю, к каким типам привязываются T во время использования?

 class RegularString<T extends string>
{
    constructor(private readonly value: string, regexPatternConstraint: T)
    {
        if(!new RegExp(regexPatternConstraint).test(value))
            throw new Error("Given value does not conform to regex "   regexPatternConstraint   ". found: "   value)
    }

    toString()
    {
        return this.value
    }
}

const strLengthThree: RegularString<"^...$"> = new RegularString<"^...$">("ABC", "^...$") 
const strLengthOne:   RegularString<"^.$"> = strLengthThree // expected not to compile, but does

console.log(strLengthOne.toString().length) // prints 3

 

Комментарии:

1. Примечание const three = "^...$"; const one: "^.$" = three не компилируется.

2. Лучшее доказательство того, что три не набрано в виде строки: const three: "^...$" = "^...$"; const one: "^.$" = three