Tips: 干啥都可以,等同于 ES 时代的 JS,对他操作之后返回的也是 any。可以访问变量里面的任何属性或方法
3. Type Inference
> let y = 1;
undefined
> y = 'a'
⨯ Unable to compile TypeScript
[eval].ts (1,1): Type '"a"' is not assignable to type 'number'. (2322)
> let l = null
undefined
> l = 1
1
> let p: number | string = 1;
undefined
> p = 2
2
> p = true
⨯ Unable to compile TypeScript
[eval].ts (1,1): Type 'true' is not assignable to type 'string | number'. (2322)
> p = '2'
'2'
> let j: number | string
undefined
> j.length
⨯ Unable to compile TypeScript
[eval].ts (1,3): Property 'length' does not exist on type 'string | number'.
Property 'length' does not exist on type 'number'. (2339)
> j = '1'
'1'
> j.length
1
Tips: 在推导(Type Inference)出到底是哪个 Type 之前,访问变量的属性或方法的时候有限制,只能访问共有的属性或方法
5. Interfaces
> interface Foo { a: number, b: string, c?: boolean}
undefined
> let BBar: Foo = { a: 1, b: 2 }
⨯ Unable to compile TypeScript
[eval].ts (1,5): Type '{ a: number; b: number; }' is not assignable to type 'Foo'.
Types of property 'b' are incompatible.
Type 'number' is not assignable to type 'string'. (2322)
> interface Foo { readonly a: number, b: string, c?: boolean, [propName: string]: any}
Tips:
? 表示该属性可以不存在。但总的来说都不允许添加未定义的属性。
[propName: string]: any 表示 Foo 中可以有 key 是 string, value 是 any 的任意属性,值的注意的是这里的 string 和 any必须覆盖到之前定义的确定属性和可选属性。
type a = (a?: string) => string
function g(m: string|a): void {}
12. String Literal Types
type specialType = 'a' | 'b' | 'c';
let a: specialType = 'a'
13. Tuple
let a: [number, string] = [1, '2']
Tips: 越界只能是已知类型的联合类型;可单独修改某个一个值;
14. Enum
enum days = { a, b, c }
enum days = { a = 1.5, b, c }
15. Class
class A extends B {
public name: string;
private age: number;
protected grade: string;
constructor(name) {
super(props);
}
}
abstract class Foo {
public name: string;
constructor(name) {
this.name = name;
}
public abstract say()
}
class Bar extends Foo {
public say() {
}
}
let bar: Bar = new Bar()
interface M {
public method1()
}
interface N {
public method2()
}
interface L extends N {
public method3();
}
class Bar extends Foo implements M, L {
public method1() {};
public method2() {};
public method3() {}
}
Tips:
public、private、protected 和 Java 中行为一致。
Abstract Class 不能被实例化,只能被其他的 class 继承,同时 abstract 中定义的 abstract 方法必须要被继承的子类实现(implements)。
Interfaces 用于不同 class 之间共有的属性或者方法。 一个 class 可以 implements 多个 interface,interface 之间也可以继承 (承上 5.interfaces)
16. Generics
function methods<T>(a: number, b: T): Array<T> {}
function swapTurple<T><U>(turple: [T, U]): [U, T] {}
interface LengthGen {
length: number
}
function testMethod<T extends LengthGen>(a: T): T {}
function testMethod<T extends U>(a: T, b: U): T {} // 保证 T的属性 U 上一定也会有
interface FooInterface<T> {
(a: number, value: T): Array<T>
}
let foo: FooInterface<any> = function method<T>(a: number, value T): Array<T> {}
TypeScript 风靡全球后不懂 TypeScript 的前端绝对不是一个好前端。TypeScript 的设计来源于大多数的静态语言,如果曾经有静态语言的开发经验,TypeScript 一整个下午就能上手。
这里记录一下 TypeScript 常用的一些语法层面的东西,方便日后查阅。
Get Start
1. Type
boolean
,number
,string
,void
,undefined
,null
2. Any
3. Type Inference
4. Union Types
5. Interfaces
6. Array
7. Function
8. Type Assertion
9. Declare
10. Standard built-in objects
11. Type Alias
12. String Literal Types
13. Tuple
14. Enum
15. Class
16. Generics
参考资料