gpt4 book ai didi

typescript - 如何在TypeScript中编写不包含空字符串的字符串类型

转载 作者:行者123 更新时间:2023-12-03 13:51:37 29 4
gpt4 key购买 nike

TypeScript 的一个函数写成如下:

function propKeyMap(propKey:string):string {
//TODO
}
propKey 不能是 ""(空字符串)。我们可以写一个不包含空字符串的类型吗?

最佳答案

简短的回答:
不,你不能这样做。只需在运行时检查 propKey 值,如果为空则抛出错误。
长答案:
TypeScript 当前(从 v2.5 开始)缺少 subtraction types ,因此无法告诉编译器类型是 string 而不是 "" 。但是,有一些解决方法。
您可以使用品牌化(参见 Microsoft/TypeScript #4895 中的讨论)来创建 string 的子类型,然后尝试自己强制执行非空约束,因为 TypeScript 不能。例如:

type NonEmptyString = string & { __brand: 'NonEmptyString' };
现在,您不能仅将 string 值分配给 NonEmptyString 变量:
const nope: NonEmptyString = 'hey'; // can't assign directly
但是您可以创建一个接受 string 并返回 NonEmptyString 的函数:
function nonEmptyString(str: ""): never;
function nonEmptyString(str: string): NonEmptyString;
function nonEmptyString(str: string): NonEmptyString {
if (str === '')
throw new TypeError('empty string passed to nonEmptyString()');
return str as NonEmptyString;
}
如果你传入一个空的 nonEmptyString() 函数 string 会在运行时爆炸,所以只要你只用这个函数构造 NonEmptyString 对象,你就是安全的。此外,如果 TypeScript 知道您传入了一个空字符串,则返回的对象将是 never 类型(本质上意味着它不应该发生)。所以它可以做一点编译时防范空字符串:
const okay = nonEmptyString('hey');
okay.charAt(0); // still a string

const oops = nonEmptyString(''); // will blow up at runtime
oops.charAt(0); // TypeScript knows that this is an error
但它确实只是一点编译时保护,因为很多时候 TypeScript 没有意识到 string 是空的:
const empty: string = ""; // you've hidden from TS the fact that empty is ""
const bigOops = nonEmptyString(empty); // will blow up at runtime
bigOops.charAt(0); // TypeScript doesn't realize that it will blow up
不过,总比没有好……或者它可能是。最重要的是,无论如何,您可能需要使用运行时检查空字符串进行编译时断言。
即使 TypeScript 可以将 NonEmptyString 原生地表达为 string - "" 之类的东西,在大多数情况下,编译器可能不够聪明,无法推断出字符串操作的结果是或不是 NonEmptyString 。我的意思是,我们知道两个 NonEmptyString 的串联长度至少应为 2,但我怀疑 TypeScript 会:
declare let x: NonEmptyString; 
declare let y: NonEmptyString;
const secondCharBad: NonEmptyString = (x + y).charAt(1); // won't work
const secondCharGood = nonEmptyString((x + y).charAt(1)); // okay
那是因为您要求的类型接近滑坡的最顶端 dependent types ,这对开发人员的表现力很有帮助,但对编译器的可判定性不太好。对于非空字符串,可能可以在类型级别上做一些合理的事情,但一般来说,您仍然会发现自己需要帮助编译器决定字符串何时实际上是非空的。

希望有帮助。祝你好运!

关于typescript - 如何在TypeScript中编写不包含空字符串的字符串类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46253340/

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