如何在TypeScript中的函数声明中指定一个返回类型,并使伞形类型变窄?

如何在TypeScript中的函数声明中指定一个返回类型,并使伞形类型变窄?,typescript,generics,Typescript,Generics,如何在TypeScript中的函数声明中指定一个返回类型,并使伞形类型变窄 例如,我有以下代码(摘自): 现在我想指定ngTemplateGuard\u状态的返回类型为布尔值。以下是我试图做的: export type T = {}; export type Loaded = { type: 'loaded', data: T }; export type Loading = { type: 'loading' }; export type LoadingState = Loaded | Loa

如何在TypeScript中的函数声明中指定一个返回类型,并使伞形类型变窄

例如,我有以下代码(摘自):

现在我想指定
ngTemplateGuard\u状态的返回类型为布尔值。以下是我试图做的:

export type T = {};
export type Loaded = { type: 'loaded', data: T };
export type Loading = { type: 'loading' };
export type LoadingState = Loaded | Loading;
export class IfLoadedDirective {
    static ngTemplateGuard_state(dir: IfLoadedDirective, expr: LoadingState): expr is Loaded: boolean { return true; };
}
以下是我得到的错误:

任何 “boolean”仅指类型,但在此处用作值。(2693)

意外标记。应为构造函数、方法、访问器或属性。(1068)

此外,我也找不到一个有文件记录和解释的伞式变窄的用法。因为,它可能会帮助我找到我问题的答案,如果有人能提供一个来源来阅读,我将不胜感激。通过
伞形变窄
我的意思是
expr在我的示例中被加载
部分

我需要它只是为了教育目的。我想清楚地理解像泛型约束和返回类型规范这样的简单语言语法。

这在typescript中被称为

类型保护是执行运行时检查以保证某个范围内的类型的表达式。要定义类型保护,我们只需要定义一个返回类型为类型谓词的函数

在上面的示例中,
expr被加载
是一个返回类型(类型谓词),并且不需要(实际上您不能)提供额外的返回类型(布尔值)

谓词的形式为
parameterName is Type
,其中
parameterName
必须是当前函数签名中的参数名称

任何时候使用类型为
LoadingState
的变量
expr
调用
ngTemplateGuard\u state
,如果函数返回truthy值,则TypeScript会将该变量缩小为类型
Loaded

这在TypeScript中调用

类型保护是执行运行时检查以保证某个范围内的类型的表达式。要定义类型保护,我们只需要定义一个返回类型为类型谓词的函数

在上面的示例中,
expr被加载
是一个返回类型(类型谓词),并且不需要(实际上您不能)提供额外的返回类型(布尔值)

谓词的形式为
parameterName is Type
,其中
parameterName
必须是当前函数签名中的参数名称


任何时候使用类型为
LoadingState
的变量
expr
调用
ngTemplateGuard\u state
时,如果函数返回truthy值,则TypeScript会将该变量缩小为类型
Loaded

这被称为TypeScript类型guard中的类型guard始终返回布尔值,无需显式声明this@AlekseyL.所以请跟你核对一下。下面的一段代码:
函数isA(arg:any):arg是一个{return(arg作为).propWhichAShouldHave;}
,用一个简单的词来说,它的意思是:如果运行名为
isA
的函数的结果是
true
(或truthy),然后在调用
isA
之后,TypeScript将把
arg
视为
A
类型,否则(当结果为false或falsy时),TypeScript将把
arg
视为绝对不是
A
类型。我理解正确吗?是的,你是对的,这在typescript中被称为类型保护类型保护总是返回布尔值,不需要显式声明this@AlekseyL.,那么,请跟你核对一下。下面的一段代码:
函数isA(arg:any):arg是一个{return(arg作为).propWhichAShouldHave;}
,用一个简单的词来说,它的意思是:如果运行名为
isA
的函数的结果是
true
(或truthy),然后在调用
isA
之后,TypeScript将把
arg
视为
A
类型,否则(当结果为false或falsy时),TypeScript将把
arg
视为绝对不是
A
类型。我理解正确吗?是的,你是对的
export type T = {};
export type Loaded = { type: 'loaded', data: T };
export type Loading = { type: 'loading' };
export type LoadingState = Loaded | Loading;
export class IfLoadedDirective {
    static ngTemplateGuard_state(dir: IfLoadedDirective, expr: LoadingState): expr is Loaded: boolean { return true; };
}