跳到主要内容

3 篇博文 含有标签「TypeScript」

查看所有标签

TypeScript 类型推断

· 阅读需 4 分钟

类型声明是 TypeScript 的灵魂所在。但是,对于之前只接触过 JavaScript 的人,不是逢类型必加。类型推断可以让 TS 写的更像 JS,哈哈。

TypeScript 的类型推论机制可以自动推断变量、函数返回值、参数等的类型,使代码更加简洁,同时保持类型安全。这有助于减少显式类型注解的需求,提高开发效率。以下是 TypeScript 类型推论的一些关键用法和示例:

1. 变量类型推论

当你声明一个变量并对其进行初始化时,TypeScript 会根据赋值的值来推断变量的类型。

let number = 42; // TypeScript 推断 number 的类型为 number
let text = "Hello, world!"; // TypeScript 推断 text 的类型为 string
let isDone = true; // TypeScript 推断 isDone 的类型为 boolean

2. 函数返回值类型推论

TypeScript 可以根据函数的返回值来推断其返回类型。

function add(a: number, b: number) {
return a + b; // TypeScript 推断返回类型为 number
}

3. 函数参数类型推论

在函数调用时,TypeScript 可以根据传递的实参来推断函数参数的类型,尤其是在使用回调函数时。

let numbers = [1, 2, 3];
numbers.forEach((number) => {
console.log(number); // TypeScript 推断 number 的类型为 number
});

4. 上下文类型推论

TypeScript 可以根据上下文来推断某些表达式的类型,例如事件处理器、回调函数等。

document.addEventListener("click", (event) => {
console.log(event.target); // TypeScript 推断 event 的类型为 MouseEvent
});

5. 泛型类型推论

在使用泛型函数或类时,TypeScript 可以根据传递的类型参数来推断具体的类型。

function identity<T>(arg: T): T {
return arg;
}

let output = identity("myString"); // TypeScript 推断 output 的类型为 string

6. 解构赋值类型推论

在解构赋值时,TypeScript 可以根据解构的对象或数组推断其类型。

let point = { x: 10, y: 20 };
let { x, y } = point; // TypeScript 推断 x 和 y 的类型为 number

示例:综合使用类型推论

以下是一个综合示例,展示了类型推论在变量、函数返回值、参数以及上下文中的应用:

// 变量类型推论
let age = 30; // TypeScript 推断 age 的类型为 number

// 函数返回值类型推论
function greet(name: string) {
return `Hello, ${name}`; // TypeScript 推断返回类型为 string
}

// 函数参数类型推论
let names = ["Alice", "Bob", "Charlie"];
names.forEach((name) => {
console.log(greet(name)); // TypeScript 推断 name 的类型为 string
});

// 上下文类型推论
window.addEventListener("resize", (event) => {
console.log(event.target); // TypeScript 推断 event 的类型为 UIEvent
});

总结

类型推论是 TypeScript 的强大特性之一,能够在不显式声明类型的情况下提供类型安全和自动补全。这使得代码更简洁,同时减少了类型注解的冗余,提高了开发效率。尽管类型推论可以处理大多数情况,但在某些复杂场景下,显式声明类型仍然是必要的,以确保代码的可读性和维护性。

typescript文件造成win文件夹卡顿原因及解决方案

· 阅读需 2 分钟
Jason Lee

写了好几天的 ts 代码,发现打开包含 ts 代码的文件夹时,文件夹会缓慢刷新,而且不是列表形式展示。非常痛苦:(

一开始以为是 windows11 的 bug,后来一想,最开始新建 ts 代码时,win11 直接把它当成视频文件,会不会和这个有关系。所以就用 google 搜了这个问题,果然,只有第一个搜索结果给出了问题原因和解决方案。正如所预料的,win11 把 ts 文件默认成视频文件,每次展示都要刷新。办法就是修改注册表,使系统默认 ts 为文本文档。新建.reg文件:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.ts]
@="txtfile"
"Content Type"="text/plain"
"PerceivedType"="text"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\KindMap]
".ts"="document"

双击即修改完成。

参考: https://www.cnblogs.com/himeka/p/16306947.html

另外,我发现只有 google 能搜到上述解决方案,bing 和 baidu 都不行。现在知道用谁了吧...

TypeScript 为 JavaScript 带来了什么

· 阅读需 6 分钟
Jason Lee

TypeError 举例,TS 是如何解决的

当一项新技术摆在我这样的懒人前,有必要弄清学它的必要性,否则一定会半途而废。JavaScript 的过于灵活,一直以来为人诟病。它所带来的麻烦,主要体现在很多 TypeError 报错,直到运行时才会暴露出来。这一点在我的编程体验中最为深刻。以下是 chatgpt 对这个问题的理解和 typescript 能在多大程度上解决这类错误。

You:

JavaScript 中的 TypeError

ChatGPT:

在 JavaScript 中,TypeError 是一种常见的错误类型,当尝试对一个数据类型执行不适合的操作时会抛出。下面是一些常见的 TypeError 发生的情况:

  1. 访问未定义的属性
let obj;
console.log(obj.property); // TypeError: Cannot read property 'property' of undefined
  1. 调用非函数类型的变量
let nonFunction = 123;
nonFunction(); // TypeError: nonFunction is not a function
  1. 将值赋给只读属性
const obj = {};
Object.defineProperty(obj, "prop", {
value: 42,
writable: false,
});
obj.prop = 77; // TypeError: Cannot assign to read only property 'prop' of object
  1. 在基础数据类型上调用方法
null.someMethod(); // TypeError: Cannot read property 'someMethod' of null
  1. 使用new关键字调用不是构造函数的对象
let notAConstructor = {};
new notAConstructor(); // TypeError: notAConstructor is not a constructor

为了处理这些错误,可以使用 try...catch 语句来捕获和处理异常。例如:

try {
let obj;
console.log(obj.property);
} catch (e) {
if (e instanceof TypeError) {
console.error("TypeError caught:", e.message);
} else {
throw e;
}
}

通过合理的错误处理,可以使代码更加健壮,并能够更好地调试和维护。

You:

这些错误能通过把 js 改写为 typescript 来解决吗

ChatGPT:

将 JavaScript 转换为 TypeScript 可以预防许多类型相关的错误,因为 TypeScript 提供了静态类型检查和更严格的语法规则。然而,TypeScript 并不能完全消除所有运行时错误。让我们看看上述几种 TypeError 是如何在 TypeScript 中得到改进或预防的:

  1. 访问未定义的属性
let obj: { property?: string };
console.log(obj.property); // TypeScript 提示 obj 可能为 undefined

TypeScript 会警告你 obj 可能是 undefined,需要检查或使用类型保护。

  1. 调用非函数类型的变量
let nonFunction: any = 123;
(nonFunction as Function)(); // TypeScript 会警告类型不匹配

TypeScript 类型系统会阻止非函数类型的变量被调用。

  1. 将值赋给只读属性
interface MyObject {
readonly prop: number;
}
const obj: MyObject = { prop: 42 };
obj.prop = 77; // TypeScript 编译错误: Cannot assign to 'prop' because it is a read-only property.

TypeScript 通过 readonly 修饰符强制只读属性不可被重新赋值。

  1. 在基础数据类型上调用方法
let nullable: null | { someMethod: () => void } = null;
nullable.someMethod(); // TypeScript 提示 nullable 可能为 null

TypeScript 会提示 nullable 可能是 null,需要进行检查。

  1. 使用new关键字调用不是构造函数的对象
let notAConstructor: any = {};
new notAConstructor(); // TypeScript 编译错误: Cannot use 'new' with an expression whose type lacks a call or construct signature.

TypeScript 会阻止在非构造函数的对象上使用 new 关键字。

TypeScript 通过静态类型检查、接口、类型断言等机制,大大减少了因为类型错误而导致的运行时异常。尽管如此,TypeScript 不能完全避免所有错误,特别是那些涉及到动态数据和外部输入的错误,因此在编写 TypeScript 代码时仍需谨慎,并结合适当的错误处理机制。

TS 很强,但是还不够

TypeScript 类型检查的范围只局限在代码编译阶段,运行时是无能为力的。比如一次数据库查询期望返回一个数组格式的数据,但是因为某种原因变成了 undefined,那么后续代码用到这个数组的地方就会报错了。所以,涉及到动态数据的,应该要手动加类型检查,比如说

if (!Array.isArray(o)) {
throw new Error();
}

强类型?弱类型?

ts 是在 js 的基础上加上了类型,因此成了一门静态语言。但是,这种静态类型还要加一个"弱"的形容词。这是因为,ts 和 js 一样会执行隐式转换而不会报错。

console.log(1 + "1");
// 打印出字符串 '11'

上面这段代码,js/ts 都能执行成功。