TypeScript - 检查类型

时间:2018-06-05 06:53:07

标签: angular typescript

我想知道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端点)?

2 个答案:

答案 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
  }
}

点击此处:https://angular.io/guide/typescript-configuration

答案 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。因此,它不像其他语言那么容易使用。