gpt4 book ai didi

typescript 通用类型断言

转载 作者:行者123 更新时间:2023-12-05 06:27:13 27 4
gpt4 key购买 nike

下面是我对 typescript 的观察总结。

这是一些代码:

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;
}

我不明白为什么这件事会失败,因为我们已经将参数限制为 combinedTypeEnum,以防万一

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。

我真的很好奇为什么会做出这样的决定。如果事情以不同的方式完成,那么看看事情是如何破裂的真的很有帮助。

最佳答案

extends 当您有字符串文字时没有多大意义。为了使解释更容易,让我使用其他类型。考虑这三个类:

class Animal {}

class Dog extends Animal {}

class Cat extends Animal {}

当我们使用泛型时,实际类型由调用者设置:

function foo<T extends Animal>(arg: T) {}

foo(new Dog()); //T is Dog, equivalent to foo(arg: Dog) {}
foo(new Cat()); //T is Cat, equivalent to foo(arg: Cat) {}

现在您可能已经知道我们要去哪里了。让我们使用类型谓词:

function foo<T extends Animal>(arg: T): arg is Cat {}

当我们调用 foo(new Dog()) 时,最后一个示例等同于此:

function foo(arg: Dog): arg is Cat {}

当然,它不起作用或没有意义。

至于你的第二个例子:变量的类型没有改变。关键是,通过断言特定类型,编译器允许您做任何可以用这种类型做的事情。

关于 typescript 通用类型断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55432141/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com