// Declare a tuple type
let x: [string, number];
// Initialize it
x = ['hello', 10]; // OK
// Initialize it incorrectly
x = [10, 'hello']; // Error
複製代碼
enum Color {Red, Green, Blue}
let c: Color = Color.Green;
複製代碼
enum Color {Red = 1, Green, Blue}
let c: Color = Color.Green;
複製代碼
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean
複製代碼
let notSure: any = 4;
notSure.ifItExists(); // okay, ifItExists might exist at runtime
notSure.toFixed(); // okay, toFixed exists (but the compiler doesn't check)
let prettySure: Object = 4;
prettySure.toFixed(); // Error: Property 'toFixed' doesn't exist on type 'Object'.
複製代碼
function warnUser(): void {
console.log("This is my warning message");
}
//聲明一個void類型的變量沒有什麼大用,由於你只能爲它賦予undefined和null:
let unusable: void = undefined
複製代碼
// Not much else we can assign to these variables!
let u: undefined = undefined;
let n: null = null;
複製代碼
// 返回never的函數必須存在沒法達到的終點
function error(message: string): never {
throw new Error(message);
}
// 推斷的返回值類型爲never
function fail() {
return error("Something failed");
}
// 返回never的函數必須存在沒法達到的終點
function infiniteLoop(): never {
while (true) {
}
}
複製代碼
// 模擬服務,提供不一樣的數據。這裏模擬了一個字符串和一個數值
var service = {
getStringValue: function() {
return "a string value";
},
getNumberValue: function() {
return 20;
}
};
// 處理數據的中間件。這裏用 log 來模擬處理,直接返回數據看成處理後的數據
function middleware(value) {
console.log(value);
return value;
}
// JS 中對於類型並不關心,因此這裏沒什麼問題
var sValue = middleware(service.getStringValue());
var nValue = middleware(service.getNumberValue());
複製代碼
const service = {
getStringValue(): string {
return "a string value";
},
getNumberValue(): number {
return 20;
}
};
複製代碼
const sValue: string = middleware(service.getStringValue());
const nValue: number = middleware(service.getNumberValue());
複製代碼
換成
typescript
的時候咱們的中間件middleware
,須要返回正確的string
和number
類型。咱們須要怎麼作啦?javascript
function middleware(value: any): any{
console.log(value);
return value;
}
複製代碼
這個方法可讓最後的類型檢測經過,可是使用
any
的話,導致middleware
就沒有什麼用了。html
middleware
function middleware1(value: string): string { ... }
function middleware2(value: number): number { ... }
複製代碼
function middleware(value: string): string; function middleware(value: number): number; function middleware(value: any): any {
// 實現同樣沒有嚴格的類型檢查
}
複製代碼
可是類型過多的話這種方法也很差使。java
function middleware<T>(value: T): T {
console.log(value);
return value;
}
複製代碼
middleware
後面緊接的<T>
表示聲明一個表示類型的變量,Value: T
表示聲明參數是T
類型的,後面的: T
表示返回值也是T
類型的。那麼在調用middlewre(getStringValue())
的時候,因爲參數推導出來是string
類型,因此這個時候 T 表明了string
,所以此時middleware
的返回類型也就是string
;而對於middleware(getNumberValue())
調用來講,這裏的T
表示了number
。typescript
vscode
的話,咱們默認你已經安裝的支持 typescript 的環境。能夠看到咱們在推導類型和返回值類型的時候,vscode
會提示你對應的 string
和 number
的類型。