我刚接触typescript,学会了如何定义自定义类型,例如:
type T = {a:number, b:any}
是否可以使用类中定义的类型构造函数,在TypeScript中定义所有长度大于2的字符串集合的类型?
或者,也许可以为所有大于0的数字定义一种类型?
我刚接触typescript,学会了如何定义自定义类型,例如:
type T = {a:number, b:any}
是否可以使用类中定义的类型构造函数,在TypeScript中定义所有长度大于2的字符串集合的类型?
或者,也许可以为所有大于0的数字定义一种类型?
type PositiveNumber = number & { positive: true}
type StringOfMinLength<T extends number> = string & { minLegth: T}
type T = {a:PositiveNumber, b:StringOfMinLength<3> }
function isPositiveNumber(value: number): value is PositiveNumber {
if( value < 0 ) return false
return true;
}
function asPositiveNumber(value: number) {
if( !isPositiveNumber(value) ) throw new Error("Not ok")
return value; // type guard above, value will now be a PositiveNumber
}
function isStringOfMinLength<T extends number>(value: string, length: T): value is StringOfMinLength<T> {
if( value.length < length ) return false;
return true;
}
function asStringOfMinLength<T extends number>(value: string, length: T): StringOfMinLength<T> {
if(!isStringOfMinLength(value, length) ) throw new Error("Not ok")
return value; // type guard above, value will now be a PositiveNumber
}
type MyData = {a:PositiveNumber, b:StringOfMinLength<3>}
let myObj: MyData = {
a: asPositiveNumber(0),
b: asStringOfMinLength("Test", 3),
}
Math.sqrt(myObj.a) // a will be greater then 0
myObj.b[2] // index will exist, length greater then 3
let myNotOkObject: MyData = {
a: -1, // will be a compile error, the checking function is not called
b: "Test" // this will also be an error event though it satisfies the constraint since we don't call the appropriate function
}
// we can also use the type guard version instead (is*) of the assertion version (as*)
let a = 10;
let b = "Test"
if(isPositiveNumber(a) && isStringOfMinLength(b, 3))
{
let myOtherObj: MyData = { a, b } // a and b are PositiveNumber and respectively StringOfMinLength<3>
} else {
// handle case when they are not what was expected
}
您可以在任何需要基础类型的地方使用品牌类型(例如Math.sqrt(myObj.a)
),但是您不能直接将基础类型分配给品牌类型的字段。这是否在实际代码中有价值取决于您和您的用例。
这篇文章对品牌类型进行了更多讨论。
编辑
添加了创建带有类型保护版本的品牌类型函数,这样您就可以检查不变量是否为真,并自行处理假情况,而不是引发错误。感谢@AluanHaddad提供的想法。