Typescript
应用
interface和type有什么区别?
interface 方式可以实现接口的 extends 和 implements , 而 type alias 则不行。
interface 可以实现接口的 merge ,但 type alias 则不行。
接口merge指的是:
interface C {
a: string;
}
interface C {
b: number;
}
const obj:C = {
a: '',
}; // Error: Type '{ a: string; }' is not assignable to type 'C'. Property 'b' is missing in type '{ a: string; }'.
type C = {
a: string;
}
// Error: Duplicate identifier 'C'.
type C = {
b: number;
}
- interface 只能定义对象类型, type 声明的方式可以定义组合类型,交叉类型,原始类型。
参考:
typescript interface 与 type 声明类型的区别 | KBScript
extends和implements有什么区别?
一般来讲,一个类只能继承自另一个类,有时候不同类之间可以有一些共有的特性,这时候就可以把特性提取成接口(interfaces),用 implements 关键字来实现。
interface Alarm {
alert();
}
interface Light {
lightOn();
lightOff();
}
class Car implements Alarm, Light {
alert() {
console.log('Car alert');
}
lightOn() {
console.log('Car light on');
}
lightOff() {
console.log('Car light off');
}
}
object类型和{}类型有什么区别?
object类型只能引用类型,即非bool, number, string, symbol。
通过实例理解:
var o: object;
o = { prop: 0 }; // OK
o = []; // OK
o = 42; // Error
o = "string"; // Error
o = false; // Error
o = null; // Error
o = undefined; // Error
var p: {};
p = { prop: 0 }; // OK
p = []; // OK
p = 42; // OK
p = "string"; // OK
p = false; // OK
p = null; // Error
p = undefined; // Error
var q: { [key: string]: any };
q = { prop: 0 }; // OK
q = []; // OK
q = 42; // Error
q = "string"; // Error
q = false; // Error
q = null; // Error
q = undefined; // Error
var r: { [key: string]: string };
r = { prop: 'string' }; // OK
r = { prop: 0 }; // Error
r = []; // Error
r = 42; // Error
r = "string"; // Error
r = false; // Error
r = null; // Error
r = undefined; // Error
参考:
ecmascript 6 - Difference between 'object' and {} in TypeScript - Stack Overflow
什么是TS的泛型?
泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。
举个例子:
// 声明一个泛型接口,这个写法,像极了声明一个函数,我们用描述语言来形容 @type = T => (T): T
interface GenericIdentityFn<T> {
(arg: T): T;
}
// 这个写法,有点像一个闭包函数,在声明函数后,立即运行这个函数,描述语言:@@[T => (T): T](any)
function identity<T>(arg: T): T {
return arg;
}
// 使用泛型接口,像极了调用一个函数,我们用描述语言来形容 @type(number)
let myIdentity: GenericIdentityFn<number> = identity;
参考:
有没有了解过ts-node?ts-node是ts的运行时吗?为什么?
ts-node不是将typescript编译成js再执行,而是直接通过hack开启了node的ts运行时。
它通过扩展require.extensions,来完成node版loader的扩展,将ts、tsx等运行时执行赋予node,至于node的loader,也就是module.extensions,可以参考。FunnyLiu/ts-node at readsource
const和readonly的区别?
const是一个编译期常量, readonly是一个运行时常量
const只能声明基元类型,枚举类型,字符串类型。readonly则无限制
const天生为静态数据,无需再添加static标识
readonly是运行时变量,只能赋值一次。特例是可以定义时赋值一次,构造函数中再赋值一次
any、never、unknown和void区别?
any 顾名思义就是任意类型。 never 表示永不存在的值的类型。 unknown 表示未知类型,即写代码的时候还不清楚会得到怎样的数据类型,它能被赋值为任何类型,但不能被赋值给除了 any 和 unknown 之外的其他类型,同时,不允许执行 unknown 类型变量的方法(any 可以)。 void 表示无任何类型,正好与 any 相反,没有类型,如果是函数则应没有返回值或者返回 undefined
如何让js工程支持ts?
利用 Babel 的 @babel/plugin-transform-typescript 插件来实现。
利用 ts-loader 结合官方 typescript 库来实现。