我正在学习打字稿,我确实在SO / Google中搜索了有关我的问题的详细说明,但是我没有找到满意的答案(或者我还不明白这里的含义是什么:https://www.typescriptlang.org/docs/handbook/advanced-types.html )
我的简单示例是,我有一个接口,其属性最初可以是字符串,然后该接口更改为具有其他类型(从字符串到对象)。
这就是发生的事情:
export interface SnippetSetReceivedFromServer {
title: string,
snippets: Array<string>
}
export interface SnippetSetTransformedByClient {
title: string,
snippets: Array<{ _id: string, sanitizedLocalThumbnail: SafeUrl }>
}
我第一次从服务器接收数据时,它具有带有字符串数组的数据形状,然后此代码段集对象获取了图像网址,并且其数据形状发生了变化。
因此,如果我只想拥有一种适用于两者的类型,则可以使用“ any”:
export interface GenericSnippetSet {
title: string,
snippets: Array<any>
}
但是为什么我不能使用这种方法:
export interface SnippetSet {
title: string,
expanded?: boolean,
snippets: Array<string | { _id: string, sanitizedLocalThumbnail: SafeUrl }>
}
我很困惑,因为我确定我看到人们在打字稿上使用“要么或”方法的示例,但是我很难找到何时(在实际意义上)可以使用以及何时不应该使用的线索?
目前,我坚持在应用程序中使用“任何”功能,但我想更好地理解这一细微差别。
答案 0 :(得分:1)
您通常希望禁止使用无效的值。您的版本将允许使用无效值。您可能会考虑这种方法:
export interface SnippetSet<T> {
title: string,
expanded?: boolean,
snippets: Array<T>
}
您现在可以在呼叫站点或通过别名进行参数化了:
type GenericSnippetSet = SnippetSet<string>
type SnippetTransformed = SnippetSet<{ _id: string, ... }>
编辑:联合类型的一个很好的用途是,任何版本的联合都是有效的,并且您打算通过一些条件代码(可能是switch语句)在运行时处理所有版本。