DEV Community

Cover image for Understanding TypeScript “as” Keyword
Super
Super

Posted on

Understanding TypeScript “as” Keyword

Overview

In TypeScript, the "as" keyword is used for type assertion, which allows us to manually set the data type of a variable and prevent the compiler from inferring it on its own. Type assertion is commonly used to treat any type as a specific type, such as a number or string. While type assertion can be useful, it's important to be careful when using it because it can disable type checking and lead to errors if used incorrectly. The "as" keyword is one way to perform type assertion in TypeScript.

Definition

In TypeScript, the "as" keyword is utilized for creating type assertions. This allows an object to be considered as a different type than what the compiler originally inferred it to be. To implement the "as" keyword in TypeScript, a specific syntax is used.

Variable as TypeOrInterface;
Enter fullscreen mode Exit fullscreen mode

The "as" keyword can be used to assert types in TypeScript with the help of a specific syntax. To demonstrate this, let's take a look at an example that utilizes the syntax we previously discussed:

let test: unknown = "hello, world";
console.log(test);

let len: number = (test as string).length;
console.log(len);

This will be the output:

hello, world
11 // the length of the string above
Enter fullscreen mode Exit fullscreen mode

The code above declares a variable called “test” and assigns it a string value. The length of this string is then calculated by converting “test” from an unknown type to a string type using the "as" keyword. To better understand how this works, try running the code in your own editor.

Use Cases

The "as" keyword is a type assertion method in TypeScript and should only be used when we want to assign another data type to a variable and are confident about it. It's important to be careful when using "as" because even a small mistake can result in errors in the code. This keyword is typically used when the type of an object is known, but the compiler is not aware of it. "As" is used to associate the required type with the object or variable for type assertion in TypeScript.

Use the "as" Keyword to Cast Types in TypeScript

In TypeScript, the keyword can be used to convert a type to a slightly more or less specific version of the expected type. To better understand how this works, let's take a look at an example:

interface employee {
    n: string
    id: number
}

function getEmployee(){
    let name : string = “Joe”;
    return {
        n: name, 
        id: 1
    };
}

let firstEmployee  = getEmployee() as employee;
Enter fullscreen mode Exit fullscreen mode

In this example, we are using type assertion to link the user object with the "employee" type. This improves the development experience by providing better auto-completion and suggestions. Running the code in your editor will provide a clearer explanation of how this works.

Utilize the "as" keyword for type predicates in TypeScript.

The "as" keyword is also utilized in type predicates, which are type guards that can be used on untyped objects or objects with weak types. To further illustrate this concept, consider the following example:

interface Employee1 {
    salary(): void;
}

interface Employee2 {
    benefits(): void;
}

function employee1OrEmployee2(): Employee1 | Employee2 {
    let employee1: Employee1 = {
        salary() {
            console.log("salary");
        }
    };
    return employee1;
}

function isEmployee1(person: Employee1 | Employee2): person is Employee1 {
    return (person as Employee1).salary !== undefined;
}

let person = employee1OrEmployee2();
if (isEmployee1(person)) {
    (person as Employee1).salary();
}
Enter fullscreen mode Exit fullscreen mode

Drawbacks

While the "as" keyword can be useful for type assertion in TypeScript, it has some drawbacks that developers should be aware of:

  1. It can lead to runtime errors: When using "as" to perform type assertion, the compiler is forced to accept the developer's assertion as true, even if it's not. This can lead to runtime errors if the type assertion is incorrect.

  2. It can disable type checking: When using "as" to perform type assertion, the compiler's type checking is disabled for that variable or expression. This can make it more difficult to catch type errors and can lead to more bugs in the code.

  3. It can make the code less readable: Overuse of the "as" keyword can make the code harder to read and understand, especially for developers who are not familiar with the codebase.

  4. It can be a sign of poor design: In some cases, the need to use "as" for type assertion may indicate a flaw in the design of the code, such as insufficient type information or a poorly defined interface.

To avoid these drawbacks, it's important to use "as" sparingly and only when necessary, and to make sure that the type assertion is accurate and well-supported by the code. It's also important to design interfaces and data structures that provide sufficient type information to the compiler, which can reduce the need for type assertion in the first place.

Conclusion

In conclusion, the "as" keyword can be a useful tool for type assertion in TypeScript, allowing developers to manually specify the type of a variable or expression. However, it's important to use "as" sparingly and only when necessary, as overuse can lead to runtime errors, disable type checking, and make the code less readable. Developers should also be aware that the need for type assertion may indicate a flaw in the design of the code, and should strive to design interfaces and data structures that provide sufficient type information to the compiler. By using "as" judiciously and designing code with type safety in mind, developers can make the most of TypeScript's powerful type system and improve the reliability and maintainability of their code.

Top comments (4)

Collapse
 
martinpersson profile image
Martin Persson

I agree with @lukeshiru but I'd like to also mention another important use-case: const assertions.

Consider this object:

const obj = {
    a: 1,
    b: "2",
    c: true,
}
Enter fullscreen mode Exit fullscreen mode

By default, TypeScript infers its type as:

const obj: {
    a: number;
    b: string;
    c: boolean;
}
Enter fullscreen mode Exit fullscreen mode

In this case, the object's values are inferred as their respective broad types (number, string, boolean), and the object itself is mutable.

However, if we use a const assertion with as const, TypeScript infers the object's literal values and also makes the object readonly to prevent mutations:

const obj = {
    a: 1,
    b: "2",
    c: true,
} as const 
Enter fullscreen mode Exit fullscreen mode

Now, TypeScript infers it as:

const obj: {
    readonly a: 1;
    readonly b: "2";
    readonly c: true;
}
Enter fullscreen mode Exit fullscreen mode

This way, we get stricter type-checking and immutability. This can be particularly useful in certain scenarios where we want to preserve the exact value literals and prevent any changes to the object.

Collapse
 
lausuarez02 profile image
Lautaro Suarez

Good explanation overall and i agree with Luke that we don't need "as" as much as we probably think and should be use just when we know "better" than the compiler.

And a little tip, you can add javascript on the same line as the block of code to have a little highlight of the javascript code ;).

Keep the good work mate.

Collapse
 
snpranav profile image
Pranav Shikarpur

I only use as any in my typescript 😛

Haha jkjk... Great blog 🙌

Collapse
 
fruntend profile image
fruntend

Сongratulations 🥳! Your article hit the top posts for the week - dev.to/fruntend/top-10-posts-for-f...
Keep it up 👍