美文网首页
类型断言

类型断言

作者: 不落05 | 来源:发表于2023-05-21 20:33 被阅读0次

类型断言(Type Assertion)可以用来手动指定一个值的类型。
两种使用方式

值 as 类型
<类型>值

建议使用相同的语法,如果使用了tsx,请使用值 as 类型

当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型中共有的属性或方法:

interface Cat {
    name: string;
    run(): void;
}
interface Fish {
    name: string;
    swim(): void;
}

function getName(animal: Cat | Fish) {
    return animal.name;
}

类型断言的用途

将一个联合类型断言为其中一个类型
interface Cat {
    name: string;
    run(): void;
}
interface Fish {
    name: string;
    swim(): void;
}

function isFish(animal: Cat | Fish) {
    if (typeof (animal as Fish).swim === 'function') {
        return true;
    }
    return false;
}
将一个父类断言为更加具体的子类
interface ApiError extends Error {
    code: number;
}
interface HttpError extends Error {
    statusCode: number;
}

function isApiError(error: Error) {
    if (typeof (error as ApiError).code === 'number') {
        return true;
    }
    return false;
}
将任何一个类型断言为 any
window.foo = 1;
// 编译错误 test.ts:1:8 - error TS2339: Property 'foo' does not exist on type 'Window & typeof globalThis'.

(window as any).foo = 1;
// 编译成功

需要注意的是,将一个变量断言为 any 可以说是解决 TypeScript 中类型问题的最后一个手段。
它极有可能掩盖了真正的类型错误,所以如果不是非常确定,就不要使用 as any。

将 any 断言为一个具体的类型
function getCacheData(key: string): any {
    return (window as any).cache[key];
}

interface Cat {
    name: string;
    run(): void;
}

const tom = getCacheData('tom') as Cat;
tom.run();

类型断言 vs 类型声明

类型声明是比类型断言更加严格的,所以为了增加代码的质量,我们最好优先使用类型声明,这也比类型断言的 as 语法更加优雅。

类型断言 vs 泛型

function getCacheData<T>(key: string): T {
    return (window as any).cache[key];
}

interface Cat {
    name: string;
    run(): void;
}

const tom = getCacheData<Cat>('tom');
tom.run();

通过给 getCacheData 函数添加了一个泛型 <T>,我们可以更加规范的实现对 getCacheData 返回值的约束,这也同时去除掉了代码中的 any,是最优的一个解决方案。

相关文章

  • 聊聊golang的类型断言

    序 本文主要研究一下golang的类型断言 类型断言 断言x不为nil且x为T类型 如果T不是接口类型,则该断言x...

  • TypeScript入门基础(类型断言、内置对象)

    类型断言 类型断言(Type Assertion)可以用来手动指定一个值的类型。语法 <类型>值 或 值 as 类...

  • 类型断言

    类型断言可以用来手动指定一个值的类型,即允许变量从一种类型更改为另一种类型

  • 类型断言

    类型断言用于指定更具体的类型:比如: 以上代码对于 ts 来说它只知道 the_canvas_element 变量...

  • TS基础(八)类型断言

    类型断言可以用来手动指定一个值得类型语法 :值 as 类型 或者<类型>值在tsx中必须使用 前者 类型断言用途 ...

  • 随笔37号20181023-go断言

    类型断言 类型断言用于提取接口的底层值(Underlying Value)。 在语法i.(T)中,接口i的具体类型...

  • TypeScript类型断言

    类型断言 类型断言(Type Assertion)可以用来手动指定一个值的类型。 语法 在 tsx 语法(Reac...

  • 1-类型断言

    类型断言适用对象 类型断言只能用于interface变量。 未实现相应接口的方法的断言,编译会失败 int32没有...

  • Typescript踩坑点

    1,类型断言类型断言更像是类型的选择,而不是类型转换举例: 代码中要返回参数的长度,但是 length 可以是字符...

  • go 接口

    空接口 断言 我们知道interface{}可以保存任意类型的数,所以我们要通过断言查询是什么类型断言的对象是空接口

网友评论

      本文标题:类型断言

      本文链接:https://www.haomeiwen.com/subject/ylzrsdtx.html