Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.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
Javascript TypeScript:在键上强制命名和在值上强制键入,可能吗?_Javascript_Angular_Typescript - Fatal编程技术网

Javascript TypeScript:在键上强制命名和在值上强制键入,可能吗?

Javascript TypeScript:在键上强制命名和在值上强制键入,可能吗?,javascript,angular,typescript,Javascript,Angular,Typescript,我正在试验角度,想知道为什么我不能强制一个对象的值成为一个确定的类型。 我正在从数据库中检索数据,数据库最终会以字符串形式返回一些数字;因此,我注意到实际上我没有在我的值上强制类型。 我有这个界面: import { Category } from './category'; import { Country } from './country'; import { Grape } from './grape'; import { Producer } from './producer'; im

我正在试验角度,想知道为什么我不能强制一个对象的值成为一个确定的类型。 我正在从数据库中检索数据,数据库最终会以字符串形式返回一些数字;因此,我注意到实际上我没有在我的值上强制类型。 我有这个界面:

import { Category } from './category';
import { Country } from './country';
import { Grape } from './grape';
import { Producer } from './producer';
import { Region } from './region';
import { Type } from './type';

export interface Drink {
    abv: number;
    category: Category;
    country: Country;
    description: string;
    grapes: Array<Grape>;
    name: string;
    price: number;
    producers: Array<Producer>;
    region: Region;
    reviews: Array<number>;
    type: Type;
    vegan: boolean;
    year: string;
}
它编译时没有错误。我还尝试创建一个专用界面,但没有成功

现在,由于“价格”、“abv”和“评论”在接口中涉及数字,所以在编译时应该会抛出错误,对吗?相反,我在chrome中得到了这个:

{
6: {
    abv:"12.5" <---------------------string
    category:{name: "sparkling"}
    country:{name: "italy"}
    description:"Lorem ipsum dolor sit amet, dolores adolescens eu mea. Ne cum eius necessitatibus. Ius ne ipsum fastidii dignissim. Putent nostro eu quo, vis agam mucius vocent id, cibo facilisis te pri. Libris ceteros vis te, nibh offendit no quo. Cu nec viris audiam."
    grapes:Array(1)
    0:{name: "glera"}
    length:1
    __proto__:Array(0)
    name:"prosecco"
    price:"15.00"   <-----------------string
    producers:[{…}]
    region:{name: "lombardy", countryID: "2"}
    reviews:(2) [5, "3"]  <--------------string
    type:{name: "conventional"}
    vegan:true
    year:"2016"
    __proto__:Object

  }
}
{
6: {

abv:“12.5”我认为这里的误解是TypeScript是如何工作的。这是一个编译时检查,所以如果你告诉它一个
饮料
有一个特定值的数字,它会在整个应用程序中强制该类型。同样,在编译时。因此它不允许你将这些属性传递给需要不同类型的方法


如果在运行时,您的API返回的是字符串而不是数字,它对此一无所知。您必须在收到API的响应后进行转换。

,因为这些类型声明只是“类型断言”,帮助编译器理解预期的数据类型,而不是“类型强制转换”这意味着将生成运行时异常

更好地阅读以下内容:


能否添加从数据库中获取数据的代码?
public drinks : { [key: string]: Drink};
{
6: {
    abv:"12.5" <---------------------string
    category:{name: "sparkling"}
    country:{name: "italy"}
    description:"Lorem ipsum dolor sit amet, dolores adolescens eu mea. Ne cum eius necessitatibus. Ius ne ipsum fastidii dignissim. Putent nostro eu quo, vis agam mucius vocent id, cibo facilisis te pri. Libris ceteros vis te, nibh offendit no quo. Cu nec viris audiam."
    grapes:Array(1)
    0:{name: "glera"}
    length:1
    __proto__:Array(0)
    name:"prosecco"
    price:"15.00"   <-----------------string
    producers:[{…}]
    region:{name: "lombardy", countryID: "2"}
    reviews:(2) [5, "3"]  <--------------string
    type:{name: "conventional"}
    vegan:true
    year:"2016"
    __proto__:Object

  }
}