在我们定义类型时,为什么打字稿不会隐式转换数据?

时间:2018-05-09 07:08:47

标签: angular typescript

我已经声明了我的数据结构并尝试从后端获取数据。来自后端的数据是JSON对象,它不会隐式地将数据从字符串转换为我定义的任何其他类型。

        For Ex :

        export interface Model { 
             data1 : EnumType,
             data2 : date
        } 

        export enum EnumType{
          Up,
          Down,
          Left,
          Right,
        }

    export class Data{
        public getData() {

            const url: string = '/data';
            let resultData : Model[] = this.http.get<Model[]>(url);
            console.log('result Data...' , resultData)
        }
    }


We are getting Data from backend like this : data1 : "UP" , data2 : '2012-01-26T13:51:50.417-07:00'


**Output:**
result Data... data1 : "UP" , data2 : '2012-01-26T13:51:50.417-07:00'

**Expected Output:**
result Data... data1 : 1(enum type) , data2 : 2012-01-26T13:51:50.417-07:00(Date format)

(OR) it should throw error since the data we are sending doesnt match.

如果我们使用&#34; noImplicitAny&#34;为什么它不会隐式转换?在tsConfig.json中它是否会隐式转换?

3 个答案:

答案 0 :(得分:1)

您的期望来自误解TypeScript实际上是什么。 TS not 设计更改任何JavaScript行为。通过TS有两个主要的JS扩展:一个类型层和转换到较低版本的JS的能力(例如使用ES5输出的类)。

您应该将类​​型图层视为代码的(非常强大的)注释。 描述您期望对象的类型,它不指定类型。使用TS时遇到的最常见的运行时错误之一是对象没有我声明的类型。因此,所有运行时类型转换仍然必须由您完成。在这种情况下,它将是对JSON.parse()的调用。另一个替代方法是使用JQuery,其中$.ajax$.get为您提供所有繁重的工作,包括JSON转换,如果您指定JSON返回类型。

noImplicitAny选项指的是其他内容。打开此选项后,必须为代码添加类型注释,即使您希望对象的类型为any。关闭该选项后,将隐式输入不带注释的变量any。同样,这纯粹是声明性的,它不会改变任何行为。

答案 1 :(得分:-1)

TypeScript仅在编译时进行类型检查。它确实会干扰运行时类型,因为它在编译时只是常规JavaScript(转换为JavaScript)。从服务器获取内容正在运行时发生,因此它与TypeScript的类型系统“无关”。

尽管如此,它可能有助于丰富您的枚举类型:

enum Direction {
   Up = "UP",
    Down = "DOWN",
    Left = "LEFT",
    Right = "RIGHT",

}

答案 2 :(得分:-1)

你应该设置:

// Instantiate the prefab
RigidBody rigidPrefab = Instantiate(Prefab, Spawnpoint.position, Spawnpoint.rotation) as Rigidbody;

// Detach all children from the parent. Each child refers to the transform of a single cube.
foreach (Transform child in rigidPrefab.transform)
{
    child.parent = null;
}

当您拨打电话时,您可以将其称为export const enum EnumType{ Up = 1, Down = 2, Left = 3, Right = 4, } ,结果会得到EnumType.UP。有关枚举的更多信息here.