gpt4 book ai didi

typescript - 如何声明必须可为空或未定义的类型

转载 作者:行者123 更新时间:2023-12-04 01:04:14 24 4
gpt4 key购买 nike

我想实现一个接受可能为 null 或未定义的参数的函数。换句话说,如果类型不能为 null 或 undefined,那么它应该抛出一个编译错误。例如:

type A = string | null; // Valid
type B = CustomInterface | undefined; // Valid;
type C = string; // Invalid;
type D = CustomInterface // Invalid

我的用例是辅助函数,例如 assertDefined,我不希望它们接受始终定义的值。

示例 ( playground link )

function assertDefined<T/*extends ???*/>(value: T) {
// ...
}

declare let a: A;
declare let b: B;
declare let c: C;
declare let d: D;

assertDefined(a); // Should allow
assertDefined(b); // Should allow
assertDefined(c); // Should not allow
assertDefined(d); // Should not allow

最佳答案

你可以做到这一点。


interface CustomInterface {
foo: number;
}

type Falsy = null | undefined

type A = string | null; // Valid
type B = CustomInterface | undefined; // Valid;
type C = string; // Invalid;
type D = CustomInterface // Invalid


function assertDefined<T>(
value: T,
...nullable: T extends null | undefined ? [] : [never]) {
}


const a: A = Math.floor(Math.random() * 11) <= 5 ? 'a' : null;
const b: B = Math.floor(Math.random() * 11) <= 5 ? { foo: 42 } : undefined;
const c: C = 'c';
const d: D = { foo: 42 }

assertDefined(a); // ok
assertDefined(b); // ok
assertDefined(c); // error
assertDefined(d); // error
assertDefined(d, 2); // still error,

为了实现所需的行为,我使用了 rest 运算符。

这意味着,如果 T 可以是 null 或 undefined ...nullable 计算结果为空数组,这意味着没有第二个参数。否则 nullable 的计算结果为 1 个元素数组 [never]

但是在这种情况下是否可以传递第二个参数?

不!你不能在 TS 中那样做。 never 表示从不 :D

所以,即使你传递了第二个参数,它仍然是错误的。

Playground

缺点:

assertDefined(d, 2 as never); // valid,

顺便说一句,您会发现 this 答案很有用。更多有趣的类型否定示例,您可以找到专用于高级 TS 类型的 in my blog

关于typescript - 如何声明必须可为空或未定义的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67055918/

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