使用强类型语言会带来很多好处,TypeScript也不例外:你使用的类型越强,就能获得越好的结果。不幸的是,TypeScript 的灵活性让我们能够使用一种大得多的类型去描述某些对象,而这些对象原本可以使用更窄更有效的类型去建模。其中一个场景就是使用字符串和数字建模。
基本类型,例如 string 或 number,对于处理极大数据的数值是有意义的。蓝狮注册登陆但是,很多情形下,我们关心的只是有限个字符串(或其它基本类型)。我们当然可以在运行时去检测这种值是不是合法,但 TypeScript 也提供了一些机制,让我们能够更好地对这样的值建模。
本文,我们将以一个非常常见的需求为例,来展示 TypeScript 的某些不大常见的特性的应用。我们的例子是多地区多语言的站点。我们将展示 TypeScript 的如下特性:
as const 表达式
keyof 和 typeof
泛型中的动态类型参数推断
映射类型
在联合中使用 never 过滤掉某些类型
一个场景
假设我们正在开发一个适用于多个国家和地区的网站。每个国家都有自己版本的站点,并且提供多种不同的语言。同时,我们想要根据下面的配置,在某些地区禁用某些语言。
const EnabledRegons = {
“GB”: {
“en”: true,
},
“IT”: {
“en”: true,
“it”: true,
},
“PL”: {
“pl”: true,
“en”: false,
},
“LU”: {
“fr”: true,
“de”: true,
“en”: true,
}
} as const;
因为我们知道,这个配置是不会被修改的,因此,蓝狮注册开户我们可以利用 as const 表达式,将其定义为只读的。
我们可以利用 TypeScript 的 playgroud 页面 ,看看这样的代码的 .d.ts 文件究竟是什么样子。
当没有 as const 表达式时,
TypeScript
.d.ts
const EnabledRegons = {
“GB”: {
“en”: true,
},
“IT”: {
“en”: true,
“it”: true,
},
“PL”: {
“pl”: true,
“en”: false,
},
“LU”: {
“fr”: true,
“de”: true,
“en”: true,
}
};
declare const EnabledRegons: {
GB: {
en: boolean;
};
IT: {
en: boolean;
it: boolean;
};
PL: {
pl: boolean;
en: boolean;
};
LU: {
fr: boolean;
de: boolean;
en: boolean;
};
};
如果添加了 as const 表达式,
TypeScript
.d.ts
const EnabledRegons = {
“GB”: {
“en”: true,
},
“IT”: {
“en”: true,
“it”: true,
},
“PL”: {
“pl”: true,
“en”: false,
},
“LU”: {
“fr”: true,
“de”: true,
“en”: true,
}
} as const;
declare const EnabledRegons: {
readonly GB: {
readonly en: true;
};
readonly IT: {
readonly en: true;
readonly it: true;
};
readonly PL: {
readonly pl: true;
readonly en: false;
};
readonly LU: {
readonly fr: true;
readonly de: true;
readonly en: true;
};
};
可以看到,当我们使用了 as const 表达式时,TypeScript 知道这些值不可能被修改,因此,在生成 .d.ts 文件时,TypeScript 将对象属性进行了冻结,防止类型扩大。而没有使用 as const 的 .d.ts 文件,属性值仅仅被定义为 boolean ,这就意味着可能被重新赋值。
0 Comments