我想知道TypeScript中的类型保护,如果在方法签名中只定义了一种类型,则需要使用它们。 TypeScript文档中的所有示例仅涉及具有联合类型的情况,例如:
myMethod(argument: string | number) {
if (typeof argument === 'string') { // do my thing }
if (typeof argument === 'number') { // do my thing }
但我发现人们在强类型时会使用typeof:
myMethod(argument: string) {
if (typeof argument === 'string') { // do my thing }
你认为这是一个好方法吗?如何检查数据,尤其是在编译期间不可用的数据(例如,从API端点)?
答案 0 :(得分:1)
如果代码是这样的
myMethod(argument: string) {
然后你不需要检查使用类型的类型,因为在打字稿中你会得到错误如果你喜欢这个
let strVar : string;
strVar = 10;//error (means you cannot assign type other then string, same gose for method)
以角度为单位,您可以通过设置配置
中的选项将其设置为避免转换为any
类型
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"lib": [ "es2015", "dom" ],
"noImplicitAny": true,//not allow implicit conversion to any type
"suppressImplicitAnyIndexErrors": true
}
}
答案 1 :(得分:0)
在我可能不知道对象是什么并且正在使用自定义接口的情况下,请使用关键字is
并编写一个typeguard函数。
例如,我想知道plant
是类型IFruit
还是IVegetable
。
function isVeggie(plant: any): plant is IVeggie {
return p.vegetable !== undefined; // vegetable is a property on IVeggie
}
function isFruit(plant: any): plant is IFruit {
return p.fruit !== undefined; // fruit is a property on IFruit
}
您的类型保护功能应返回true或false。我想检查每种类型的给定属性,作为添加的检查。
要使用类型保护,您需要将其强制转换为any
。
if (isVeggie(plant)) {
plant as any as IVeggie;
// Now you know plant is of type IVeggie
}
不幸的是,您必须在声明到自定义接口(即:any
)之前声明到IVeggie
。因此,它不像其他语言那么容易使用。