虽然创建声明文件的快速而肮脏的方法是减少使用TypeScript的初始阻力的重要一步。考虑jquery的用例,您可以非常轻松快速地为它创建一个定义:declarevar$:any;有时,你可能想给一些变量一些明确的定义(例如:jquery),你会在类型中声明它,在空间中使用它。您可以使用type关键字快速实现此目的:declaretypeJQuery=any;declarevar$:JQuery;这为您提供了更清晰的使用模式。再一次,DefinitelyTyped中已经存在高质量的jquery.d.ts。现在您知道了如何在使用JavaScript第三方模块时克服JavaScript到TypeScript的阻力。接下来,我们将讨论环境声明。own']=2)]='Unknown';})(Tristate||(Tristate={}));这意味着我们可以跨文件、模块拆分枚举定义~enumColor{Red,Green,Blue}enumColor{DarkRed=3,DarkGreen,DarkBlue}提示:您应该初始化枚举的延续块中的第一个成员,以便生成的代码不是先前定义的枚举类型值如果您定义初始值函数声明,TypeScript将警告您:typeLongHand={(a:number):number;};输入ShortHand=(a:number)=>number;可调用接口ReturnString{():字符串;箭头函数const简单:(foo:number)=>string=foo=>foo.toString();提示:它只能用作简单的箭头函数,不能使用重载。如果你想使用它,你必须使用完整的语法{(someArgs):someReturn}Instantiable:interfaceCallMeWithNewToGetString{new():string;}//usedeclareconstFoo:CallMeWithNewToGetString;constbar=newFoo();//bar被推断为string类型断言:建议只使用统一的asfoo语法,而不是的初始用法:letfoo:any;letbar=foo;//现在bar的类型是'string'但是,当您在JSX中使用断言语法时,这与JSX语法不明确:letfoo=bar;;因此,为了一致性,我们建议您使用asfoo的语法来断言类型断言和类型转换。它不被称为“类型转换”的原因是因为转换通常意味着某种运行时支持。新鲜度为了让检查对象字面量类型变得更容易,TypeScript提供了“新鲜度”(也称为更严格的对象字面量检查)的概念,以确保对象字面量在结构上是类型兼容的。结构类型非常方便。考虑以下示例代码,它允许您非常方便地从JavaScript迁移到TypeScript,并将提供类型安全:functionlogName(something:{name:string}){console.log(something.name);}constperson={姓名:'马特',工作:'很棒'};constanimal={name:'cow',diet:'素食主义者,但有自己的牛奶'};constrandow={注意:`我没有name属性`};logName(person);//oklogName(动物);//oklogName(随机);//错误:没有`name`属性但是,结构类型有一个缺点,它可能会误导您认为收到的数据比实际接收的数据多。例如,TypeScript发出错误警告:functionlogName(something:{name:string}){console.log(something.name);}logName({name:'matt'});//oklogName({name:'matt'',job:'beingawesome'});//错误:对象字面量只能指定已知属性,此处不存在`job`属性。警告请注意,此错误消息仅发生在对象文字上不允许的属性:类型可以包含索引签名以明确可以使用其他属性:letx:{foo:number,[x:string]:any};x={foo:1,baz:2};//ok,'baz'属性匹配React中的索引签名readonly/你可以放心,没有人会这样做。this.props.foo=123;//错误:道具是不可变的this.state.baz=456;//错误:你应该使用this.setState()}}泛型//创建一个泛型类classQueue{privatedata:T[]=[];push=(item:T)=>this.data.push(item);弹出=():T|undefined=>this.data.shift();}//简单使用constqueue=newQueue();queue.push(0);queue.push('1');//Error:Cannotpusha`string`,onlynumbertypeisallowed你可以随意调用泛型参数,当你使用简单的泛型时,泛型通常用T、U、V来表示。如果你有不止一种泛型在你的参数中,你应该使用一个更语义化的名字,比如TKey和TValue(通常,以T作为泛型类型的前缀,在其他语言如C++中,也称为Template)VariantsVariants是一个简单而重要的在类型兼容性方面需要理解的概念。