Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 带有泛型的用户定义类型保护可能无法工作_Typescript - Fatal编程技术网

Typescript 带有泛型的用户定义类型保护可能无法工作

Typescript 带有泛型的用户定义类型保护可能无法工作,typescript,Typescript,我在Scala中实现了一个类似的结果类型,但根据E和T的组合,用户定义的类型保护可能无法正常工作 类型结果=成功|失败 班级成功{ 构造函数(只读值:T){} isSuccess():这就是成功{ 返回真值 } isFailure():这是失败{ 返回错误 } } 阶级失败{ 构造函数(只读值:E){} isSuccess():这就是成功{ 返回错误 } isFailure():这是失败{ 返回真值 } } 在第一个示例中,isSuccess()被识别为结果。isFailure()从来都不是

我在Scala中实现了一个类似的结果类型,但根据E和T的组合,用户定义的类型保护可能无法正常工作

类型结果=成功|失败
班级成功{
构造函数(只读值:T){}
isSuccess():这就是成功{
返回真值
}
isFailure():这是失败{
返回错误
}
}
阶级失败{
构造函数(只读值:E){}
isSuccess():这就是成功{
返回错误
}
isFailure():这是失败{
返回真值
}
}
在第一个示例中,isSuccess()被识别为结果。isFailure()从来都不是

函数example1():结果{
返回新的成功(“成功”)
}
const result1=example1()
if(result1.issucess()){
result1//Result
}
if(result1.isFailure()){
结果1//never
}
在第二个示例中,issucess()被正确识别,但isFailure()被识别为结果

函数example2():结果{
返回新的成功(“成功”)
}
const result2=example2()
if(result2.issucess()){
结果2//成功
}
if(result2.isFailure()){
结果2//Result
}

在这两种情况下,都可以正确识别使用instanceof。如何使用用户定义的类型保护来正确识别?

不幸的是,您的两种类型成功和失败具有相同的结构,因此从typescript的角度来看是相同的和可互换的

由于构造函数签名
typeof Success
typeof Failure
可能不同(当T和E不同时),因此要澄清,但由于与实例相关的成员或方法没有不同之处,因此实例是可互换的。我的意思是这是合法的:

//这在原始定义中成功
常数f:失败=新的成功(“”);
试着这样做:

类型结果=成功|失败
班级成功{
构造函数(只读值:T){this.success=value}
私人成功:T;
isSuccess():这就是成功{
返回真值
}
isFailure():这是失败{
返回错误
}
}
阶级失败{
构造函数(只读值:E){this.failure=value}
私人失败:E;
isSuccess():这就是成功{
返回错误
}
isFailure():这是失败{
返回真值
}
}
函数示例():结果{
返回新的成功(“成功”)
}
const result=example();
if(result.issucess()){
结果//成功
}
if(result.isFailure()){
结果//失败
}
请注意用于保存值的不同属性

//现在此分配不再合法
常数f:失败=新的成功(“”);
有关类型兼容性的详细信息


我明白。谢谢你礼貌的回答。