【发布时间】:2019-08-21 06:18:47
【问题描述】:
以下是我对打字稿的观察总结。
这里有一些代码:
type someTypeEnum = '1';
type someOtherTypeEnum = '2' | '3';
type combinedTypeEnum = someTypeEnum | someOtherTypeEnum;
这是第一种情况:-
function typeAssertion<T extends combinedTypeEnum>(args: T): args is someTypeEnum {
// The error i get
// A type predicate's type must be assignable to its parameter's type.
// Type '"1"' is not assignable to type 'T'.
return undefined;
}
我不明白为什么这件事会失败,因为我们已经将我们的参数限制为 combineTypeEnum,以防万一
typeAssertion('4')
我们已经收到一条错误消息,指出 '4' 不是有效参数,那么为什么 args is someTypeEnum 被视为无效谓词。
这是第二种情况:-
function typeAssertion(args: combinedTypeEnum): args is someTypeEnum {
return undefined;
}
这似乎工作正常,但万一我们这样做:-
function someFunction<T extends combinedTypeEnum>(args: T): T {
if (typeAssertion(args)) {
// args here is 'T & "1"'
args
}
return args
};
为什么我们有 T & "1" 而不仅仅是 "1",我们特别断言它是 someTypeEnum。
我真的很好奇为什么会做出这样的决定。 如果事情以不同的方式完成,看看事情是如何破裂的,这将非常有帮助。
【问题讨论】:
-
为什么这个类型保护函数需要是通用的?
标签: typescript typescript-typings typescript-generics