#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