首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

TS 从 0 到 1 - 泛型进阶

# 确保属性存在 有时,希望类型变量对应的类型上存在某些属性,除非显式地将特定属性定义为类型变量,否自编译器不会知道这些属性是否存在。...error return arg; } # 检查对象上的键是否存在 keyof 用于获取某种类型的所有键,其返回类型是联合类型: interface Person { name: string...T 确保参数 key 一定是对象中含有的键,这样就不会发生运行时错误。...# 泛型参数默认类型 可以为泛型中的类型参数指定默认类型,当使用泛型时没有在代码中直接指定参数类型参数,从实际值参数中无法推断出类型时,这个默认类型就会起作用。...虽然之前代码中使用了 extends 关键字,但也不一定要强制满足继承关系,而是检查是否满足结构兼容性。 // 若 T 能赋值给 U 那么类型是 X,否则是 Y T extends U ?

73520

【TypeScript 演化史 — 第七章】映射类型和更好的字面量类型推断

在运行时,分配要么抛出一个类型错误(严格模式),要么静默失败(非严格模式)。 虽然上面的示例可以正确地编译和工作,但它有两大缺点 需要两个接口。...T>,这是一个映射类型,它的定义如下: type ReadonlyT> = { readonly [P in keyof T]: T[P] }; 这个语法一开始可能会让人望而生畏,咱们来一步一步分析它...[P in keyof T]: T[P]表示将 T类型的每个属性 P 的类型转换为 T[P]。如果没有readonly修饰符,这将是一个身份转换。...试图更改其他位置的值会导致编译时错误。因此,推断只读类属性的字面量类型是合理的,因为它的值不会改变。...也就是说,它会被编译时删除掉,不会出现在生成的 JS 代码中。 推断字面量类型的有用性 你可能会问自己,为什么推断 const 变量和 readonly 属性为字面量类型是有用的。

3.8K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【TypeScript 演化史 -- 7】映射类型和更好的字面量类型推断

    在运行时,分配要么抛出一个类型错误(严格模式),要么静默失败(非严格模式)。 虽然上面的示例可以正确地编译和工作,但它有两大缺点 需要两个接口。...T>,这是一个映射类型,它的定义如下: type ReadonlyT> = { readonly [P in keyof T]: T[P] }; 这个语法一开始可能会让人望而生畏,咱们来一步一步分析它...[P in keyof T]: T[P]表示将 T类型的每个属性 P 的类型转换为 T[P]。如果没有readonly修饰符,这将是一个身份转换。...试图更改其他位置的值会导致编译时错误。因此,推断只读类属性的字面量类型是合理的,因为它的值不会改变。...也就是说,它会被编译时删除掉,不会出现在生成的 JS 代码中。 推断字面量类型的有用性 你可能会问自己,为什么推断 const 变量和 readonly 属性为字面量类型是有用的。

    2.9K10

    掌握 TypeScript:20 个提高代码质量的最佳实践

    类型推断是 TypeScript 编译器根据变量赋值的值自动推断变量类型的能力。这意味着你不必在每次声明变量时都显式指定类型。相反,编译器会根据值推断类型。...这意味着,当你将一个对象分配给带有接口类型的变量时,TypeScript 会检查对象是否具有接口中指定的所有属性和方法。...这可以帮助你在编译时捕捉到类型错误,而不是在运行时。...它用于指示函数不会正常返回,而是会抛出错误。这是一种很好的方式,可以向其他开发人员(和编译器)指示一个函数不能以某种方式使用,这可以帮助捕捉潜在的错误。...T>(obj: T, key: K) { return obj[key]; } 这将允许你在编译时检查 key 是否为对象 T 的键之一,并返回该键对应的值。

    4.2K30

    精读《Typescript 4.5-4.6 新特性》

    强制保留 import TS 编译时会把没用到的 import 干掉,但这次提供了 --preserveValueImports 参数禁用这一特性,原因是以下情况会导致误移除 import: import.../something.json", { assert: { type: "json" } }) TS 该特性支持了任意类型的断言,而不关心浏览器是否识别。...但由于 TS 支持泛型,如下写法就是一种无限递归的例子: interface SourceT> { prop: SourceT>>; } interface TargetT...TS 为了确保该情况不会出错,做了递归深度判断,过深的递归会终止判断,但这会带来一个问题,即无法识别下面的错误: interface FooT> { prop: T; } declare let...移除 JSX 编译时产生的非必要代码 JSX 编译时干掉了最后一个没有意义的 void 0,减少了代码体积: - export const el = _jsx("div", { children: "foo

    68120

    No 3. 变量与数据类型

    Java 编译器中,对于字符串和其他数据类型之间,可以使用 + 进行连接,编译器会自动将其他数据类型自动转换为字符串,然后再进行连接; String 既然是不可变,那有什么优点呢?...数据类型转换 对于基本数据类型,不同类型之间是可以相互转换的,但是需要满足一定的条件; 从小到大自动转,从大到小强制转。...来说下: int num = 3; double ans = 5.0; // 要将 double 类型的值赋值给 int,则需要强制转换 num = (int)ans; 注意: 强制转换可能会导致精度丢失...static void main(String[] args){ // 声明一个常量并赋值 final int num = 1024; // 再次赋值,将导致编译错误...声明一个常量但不赋值 final int id; // 因为声明时未赋值,所以可以进程初次赋值 id = 1; // 常量已经赋值过了,再次赋值将导致编译错误

    2.2K20

    让你的TypeScript代码更优雅,这10个特性你需要了解下

    1、keyof 操作符的基本用法 keyof 操作符会提取一个对象类型的所有键,并将这些键组成一个联合类型。...下面是一个示例,展示了如何使用 keyof 操作符和索引访问类型来创建灵活的类型: function getPropertyT, K extends keyof T>(obj: T, key: K):...以下是一个示例,展示了如何将类型的所有属性设为只读: type ReadOnlyT> = { readonly [P in keyof T]: T[P]; }; 在这个例子中,ReadOnly...在这个示例中,readonlyUser 是一个 ReadOnly类型的实例,所有属性都被设为只读,因此尝试修改属性值会导致编译错误。...readonlyUser 是一个 ReadonlyUser 类型的实例,其中所有属性都是只读的,因此尝试修改属性值会导致编译错误。

    27010

    深入理解 TypeScript 中的 Keyof 运算符,让你的代码更安全、更灵活!

    getProperty(manager, 'empCode'); // 返回类型为 number // const invalidType = getProperty(manager, 'sal'); // 编译错误...编译器会验证传递的键是否匹配类型 T 的属性名,因为我们对第二个参数应用了类型约束。...三、 KeyOf 与映射类型的结合使用 在 TypeScript 中,我们可以使用 keyof 运算符与映射类型结合,将现有类型转换为新类型。...例如: 动态访问对象属性 : 使用 keyof 可以确保我们访问的属性在对象上是有效的,从而避免运行时错误。...这种方式不仅提高了代码的可读性和维护性,还减少了潜在的错误。 五、索引签名与 KeyOf 运算符 在 TypeScript 中,keyof 运算符可以与索引签名一起使用,以移除索引类型。

    23910

    Typescript 高级用法以及项目实战问题

    如果入参是any,则会放弃检查直接成功,带来报错风险 } void 在 TS 中,void 和 undefined 功能高度类似,可以在逻辑上避免不小心使用了空指针导致的错误。...b时,编译器会自动生成如下代码 a === null || a === void 0 ?...type PickT, K extends keyof T> = { [P in K]: T[P] } 我们还是用上面的Animal定义,看一下 Pick 如何使用。...六、项目实战 这里分享一些我个人的想法,可能也许会比较片面甚至错误,欢迎大家积极留言讨论 Q: 偏好使用 interface 还是 type 来定义类型?...Q: 是否允许 any 类型的出现 A: 说实话,刚开始使用 TS 的时候还是挺喜欢用 any 的,毕竟大家都是从 JS 过渡过来的,对这种影响效率的代码开发方式并不能完全接受,因此不管是出于偷懒还是找不到合适定义的情况

    1.9K50
    领券