如何在TypeScript中的函数声明中指定一个返回类型,并使伞形类型变窄?
如何在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
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; };
}