第一課, 體驗typescriptjavascript
第三課, 泛型vue
第四課, 解讀高級類型java
若是你發現本身寫的功能(函數/類/接口等...)愈來愈多, 你想對他們進行分組管理就能夠用命名空間, 下面先用"類"舉例:github
namespace Tools {
const TIMEOUT = 100;
export class Ftp {
constructor() {
setTimeout(() => {
console.log('Ftp');
}, TIMEOUT)
}
}
export class Http {
constructor() {
console.log('Http');
}
}
export function parseURL(){
console.log('parseURL');
}
}
複製代碼
仔細看你會發現namespace
下還有export
, export
在這裏用來表示哪些功能是能夠外部訪問的:typescript
Tools.TIMEOUT // 報錯, Tools上沒有這個屬性
Tools.parseURL() // 'parseURL'
複製代碼
最後咱們看下編譯成js後的代碼:微信
"use strict";
var Tools;
(function (Tools) {
const TIMEOUT = 100;
class Ftp {
constructor() {
setTimeout(() => {
console.log('Ftp');
}, TIMEOUT);
}
}
Tools.Ftp = Ftp;
class Http {
constructor() {
console.log('Http');
}
}
Tools.Http = Http;
function parseURL() {
console.log('parseURL');
}
Tools.parseURL = parseURL;
})(Tools || (Tools = {}));
複製代碼
看js代碼能發現, 在js中命名空間其實就是一個全局對象. 若是你開發的程序想要暴露一個全局變量就能夠用namespace
;函數
命名空間不只能夠用在邏輯代碼中, 也能夠用在類型, 用來給類型分組:post
namespace Food {
export type A = Window;
export interface Fruits{
taste: string;
hardness: number;
}
export interface Meat{
taste: string;
heat: number;
}
}
let meat: Food.Meat;
let fruits: Food.Fruits;
複製代碼
有2種方式, 一種/// <reference path="xxx.ts" />
, 還有就是import
:
經過reference
進行導入至關於xxx.ts
文件內的命名空間和當前文件進行了合併:
// xxx.ts
namespace Food {
export interface Fruits{
taste: string;
hardness: number;
}
}
複製代碼
// yyy.ts
<reference path="xxx.ts" />
let meat: Food.Meat;
let fruits: Food.Fruits;
複製代碼
如今在yyy.ts
中咱們就能夠直接使用xxx.ts
中的Food
類型了, 而不須要使用import
.
若是命名空間是用export
導出的, 那麼使用的時候就不能夠用/// <reference/>
了, 要用import
導入:
// xxx.ts
// 使用export導出
export interface Fruits{
taste: string;
hardness: number;
}
export interface Meat{
taste: string;
heat: number;
}
複製代碼
// yyy.ts
import {Food} from './xxx'; // 使用import導入
let meat: Food.Meat;
let fruits: Food.Fruits;
複製代碼
咱們知道接口是能夠合併的, 命名空間也是能夠的, 下面咱們把Vegetables
類型合併到Food
類型中:
// xxx.ts
namespace Food {
export interface Fruits{
taste: string;
hardness: number;
}
}
複製代碼
// yyy.ts
<reference path="xxx.ts" />
namespace Food {
export interface Vegetables{
title: string;
heat: number;
}
}
type Vh = Food.Vegetables['heat'] // number;
複製代碼
若是你的tsconfig
中設置了"module": "umd",
, 那麼export = Food
等價於export default Food
, export=
常見於支持umd的插件的聲明文件.
其實咱們看下那些老牌插件(jq/lodash)裏使用namespace
特性的代碼, 能夠發現主要是在聲明文件中(xxx.d.ts), 用來表示暴露出來的全局變量(好比lodash的"_").
上面爲了解釋命名空間說起了聲明文件(xxx.d.ts), 但因爲聲明(declare)的內容不少, 因此我會在下一節詳細介紹.
其實若是你的項目直接是用ts寫的可能用不上namespace
, 畢竟export
就能夠產生模塊, 模塊自然就有隔離分組做用.
能力有限, 若是路過大神看到不對的地方還請多多指點, 我必虛心接受.
最後建議你們多寫多練, 祝你們早日上手ts, 放幾個我用ts寫的項目當作參考, 拋磚引玉, 加油!
手勢庫, 支持點擊/拖拽/旋轉/縮放: github.com/any86/any-t…
爲vue組件生成this.$xxx的命令: github.com/any86/vue-c…
有疑問能夠加羣, 羣裏有好多前端的小夥伴, 讓咱們共同窗習成長吧!