首页 > 解决方案 > TypeScript:为什么我不能删除这种类型断言?

问题描述

为什么这段代码无法编译?

interface TaggedProduct {
    tag: string;
}
interface Product {
    tag?: string;
}
const tagProduct = (product: Product): TaggedProduct => {
    const tag: string = "anything";
    product.tag = tag;

    // Type 'Product' is not assignable to type 'TaggedProduct'.
    // Property 'tag' is optional in type 'Product' but required in type 'TaggedProduct'.ts(2322)
    return product; // Won't compile
}

我认为,如果您将一个tag字段添加到 a Product,您一定有一个TaggedProduct. 为什么 TypeScript 不这么认为?我可以在没有类型断言的情况下解决这个问题吗?

标签: typescripttypescasting

解决方案


您可以使用Object.assign来避免类型断言:

const tagProduct = (product: Product): TaggedProduct => {
  const tag: string = "anything";
  return Object.assign(product, {tag});
}

这是因为Object.assign是这样输入的:

interface ObjectConstructor {
  assign<T, U>(target: T, source: U): T & U;
}

所以返回类型Product & {tag: string}可以分配给TaggedProduct


推荐阅读