TypeScript 中 string 和 String(大写 S)、string[] 和 [string] 有什么不同
string和String(大写S)有什么不同
TypeScript使用的是静态类型,用来指定变量可以存储的数据类型。
在TypeScript 中也区分了string和String两个数据类型 ,string表示原生类型,String表示对象
理论上来说是一样的,同样能用来定义变量为string类型下面举个例子:
//string
const test1: string = 'Hello World';
console.log(typeof(test1)); //string
//String(大写S)
const test2: String = 'Hello TS';
console.log(typeof(test2)); //string
可以看到,输出的同样都是string,说明都能用来定义string类型
要是用new String来创建呢,会不会还是一样的?知道object的相信已经知道答案了,我再拿上面的来举个例子:
//用new String 来创建变量
test3: String = new String ('Hello TS');
console.log(typeof(test3)); // object
接下来看看他们是否相等
console.log( test1 === test2 ); // true
console.log( test1 === test3 ); // false
console.log( test2 === test3 ); // false
String有个有意思的地方,即使创建了两个相同的变量,他们只想的内存也是不同的
比如:
let a = new String('aaa');
let b = new String('aaa');
console.log(a === b); // false
string[] 和 [string] 有什么不同
首先这个建议是看看ts基础类型的文档写的很详细很完美了。
可以看到 []
是元组,元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。
先说一下string[]
// string[] 意思就是一个由string组成的数组,没有规定长度,只要数组里面都是string 就行就算你是空的也行
const arr1: string[] = []; // OK string也包括了null 所以空的也行
const arr2: string[] = ['aaa']; // OK
const arr3: string[] = ['aaa', 'bbb',...(都是sting类型的)]; // OK
然后是[string]
// 直接上例子
const a: [string] = ['aaa'] //OK
const b: [string] = ['aaa', 'bbb'] // error 不能将类型“[string, string]”分配给类型“[string]”。源具有 2 个元素,但目标仅允许 1 个
const c: [string] = [] // error 不能将类型“[]”分配给类型“[string]”。源具有 0 个元素,但目标需要 1 个。
类型断言
断言的方法就相当于是告诉ts,不用你来判断了,这个类型他就是 xxx!
官网的具体解释如下:
类型断言有两种形式。 其一是“尖括号”语法:
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;
另一个为as
语法:
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;
分享一下我昨天遇到的奇怪的问题
场景如下
const 'range-time-picker': [string, string] = ['', ''];
组件需要的是传入一个开始时间和结束时间,我想着就两个string初始化一下的,
结果显示报错,显示类型是string[]
跟[string, string]
不兼容。
我当时看到就很疑惑了,这有什么不同吗?就是同一个意思啊(真有不同的话望指正感谢)
['', '']
即能判断为是string[]
也能判断为[string, string]
没毛病啊😭
后来我终于懂了
用 as
你说[string, string
的类型是string[]
,我偏说他是[string, string]
然后就改成这样了
const 'range-time-picker': [string, string] = ['', ''] as [string, string]
总结
类型断言还挺好用
有时候希望ts判断正确的时候他没判断对可以给他纠正回来,
比如 string
这个类型,也可能会是null
那么有时候就可会出现必须是string
类型的要求,这个时候就得准确的告诉ts 这个变量他就是string
不是null
于是就 'string' as string
这么写,结束。
-
Vue3
-
Typescript
-
前端