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这么写,结束。