如何在 TypeScript 中将未知类型转换为字符串?

14

我正在处理来自外部代码的接口。简化为最少的代码如下:

interface Input {
    details?: unknown;
}

现在我需要将这个对象映射到具有不同类型的另一个对象中:
interface Output {
    message?: string;
}

因此,需要将 unknown 转换为 string。我的初始方法是简单地调用 input.details.toString(),但由于 unknown 也可以是 nullundefined,所以无法使用 toString

我该如何将 Input 转换为 Output


当一个接口将类型定义为“unknown”时,这意味着除了保留引用之外,您不允许对该数据执行任何操作。如果这个外部代码希望您对此数据执行任何操作(除了可能将其转发回给他们),那么该类型就不应该被标记为“unknown”。如果更精确的类型不可能,则应至少为“any”。 - ccarton
据我所知,unknown 只是 any 的类型安全替代品。那么为什么你认为 any 更好呢? - Duncan Lukkenaer
“unknown”是“类型安全”的,因为您不允许对数据执行任何操作。如果他们希望您实际上对数据执行某些操作,则类型应该反映出他们希望您执行的操作。 - ccarton
2个回答

13
unknown 转换为 string,可以使用一个typeof类型守卫。下面三元表达式的类型将被推断为string | undefined
const output: Output = {
    message: typeof input.details === 'string'
        ? input.details
        : undefined,
};

1
你怎么知道 input.details 只可能是 string 或者 undefined - Ari Ohsie
@AriOhsie 我们不知道具体是什么类型,但如果它是字符串,我们就会返回它。如果不是,我们会返回 undefined。这样结果就只会是string或者undefined - Duncan Lukkenaer
你想如何使用期望的输出类型Array<String>来完成这个操作? - SpyderScript
1
@SpyderScript 首先使用 Array.isArray() 检查该值是否为数组,如果是,则将每个项映射到上面的 string | undefined,以便最终得到 Array<string | undefined> | undefined - Duncan Lukkenaer

0
在给定的解决方案中,该值将仅为undefined,因为typeof input.details从未等于string,因为已经给定typeof input.detailsunknown

一个解决方法是您可以使用
const output: Output = {
    message: input.details as string
}

另一种解决方法是使用以下方式使用JSON.stringify()JSON.parse()
const output: Output = {
    message: JSON.parse(JSON.stringify(input.details))
}

请在有问题的地方进行评论,如果有用的话请批准。谢谢。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接