Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 如何使用变量从联合类型中选择类型_Typescript - Fatal编程技术网

Typescript 如何使用变量从联合类型中选择类型

Typescript 如何使用变量从联合类型中选择类型,typescript,Typescript,我有一种像这样的类型 type CreateOrUpdateMutationResult = { createArticle: boolean } | { updateArticle: boolean } 参数结果是CreateOrUpdateStationResult类型 我有一个额外的变量isCreate,它可以判断结果类型 但是我怎样才能让typescript知道结果的真实类型呢 // here ts don't know the result type const status = i

我有一种像这样的类型

type CreateOrUpdateMutationResult = { createArticle: boolean } | { updateArticle: boolean }
参数结果是CreateOrUpdateStationResult类型

我有一个额外的变量isCreate,它可以判断结果类型

但是我怎样才能让typescript知道结果的真实类型呢

// here ts don't know the result type
const status = isCreate ? result.createArticle : result.updateArticle
我希望ts知道结果的类型

如果您知道它是什么,可以使用as转换使其成为正确的类型

interface CreateMutationResult { createArticle: boolean }
interface UpdateMutationResult { updateArticle: boolean }
type CreateOrUpdateMutationResult = CreateMutationResult | UpdateMutationResult
然后


对此,几乎没有可能的解决方案:

您可以测试一个唯一的密钥

const status = 'createArticle' in result ? result.createArticle : result.updateArticle;
当您测试只存在于一种类型中的密钥时,typescript能够根据它推断出类型

或者你可以用打字机

function isCreateResult(result: CreateOrUpdateMutationResult, isCreate: boolean): result is { createArticle: boolean } {
    return isCreate; // or 'createArticle' in result
}

const status =  isCreateResult(result, isCreate) ? result.createArticle : result.updateArticle
正如您所看到的,实际上并不需要isCreate标志,因为javascript允许以惯用的方式测试键

function isCreateResult(result: CreateOrUpdateMutationResult, isCreate: boolean): result is { createArticle: boolean } {
    return isCreate; // or 'createArticle' in result
}

const status =  isCreateResult(result, isCreate) ? result.createArticle : result.updateArticle