type Pluralize<T extends string> = T extends `${infer S}sis`
? `${S}ses`
: T extends `${infer S}y`
? `${S}ies`
: T extends `${infer S}s`
? T
: `${T}s`;
该解决方案有效,但是它无法正确将“ Day”之类的单词转换为“ Days”,而是将其转换为“ Daies”。从理论上讲,我可以添加更多规则来使其变得坚固,但这似乎是在重新发明轮子。 我想编写一种类型,该类型不是简单地替换结尾,而是将功能应用于字符串。我尝试了解决方案:
import pluralize from "pluralize";
type Pluralize<T extends string> = T extends string ? pluralize(T) : never;
如果是“函数”,您特别指的是
javascript函数,那么这在打字稿中是不可能的。 JavaScript代码在运行时运行,而JavaScript代码不能简单地“抬高”到在编译时运行的类型级别。 Typescript的类型语法实际上是一种不同的,很大程度上是latect的语言,并且在某种程度上类似于JavaScript,这是因为它们通常是彼此之间的Analogous
,但不是相同的。 您可以写const x = 5;
和type X = 5;
type X = Math.sqrt(25)
或类似的东西。作为一种声明性的语言,您几乎没有像javaScript那样具有强大语言的control流。没有什么比if (X < Y) { type Z = 1; }
或while (X < 10) { type X = X + 1 }
。有传递条件类型
,但是这些类型与递归功能编程实现更相似,而不是JavaScript。因此,无论如何,您无法将某些JavaScript库并将其运行时函数导入到类型级别,然后将其用于函数。Microsoft/typeScript#41577
有一个长期存在的开放式功能请求,允许人们编写“函数”以定义类型。目前尚不清楚如何实施。 Typescript具有很多功能和活动部件,任何添加的功能都必须与它们一起效果很好。,例如,有
type推理。您可以编写
type X<T> = {x: T}
然后
declare function f<T>(x: X<T>): T
然后调用f({x: "abc"})
,然后打字条可以点,对于该呼叫,必须是T
。这意味着它看着string
的定义,并弄清楚了{x: "abc"}
X<T>
应该与之匹配的内容。就像运行函数backwards一样。推理并不完美,但是如果人们开始添加任意类型的功能,他们至少必须
想推理。类型不是对值的一对一映射,它们更像是一对多的。因此,您必须确定您的类型的作用,例如,使用unions和
theTersections。它会以某种方式在他们身上吗?那optional属性呢?等等等
nyway,即使他们确实实施了它,也不太可能只是您可以导入一些运行时库。充其量是以更急切的“样式”编写声明性类型的一些更符合人体工程学的方式。但这是纯粹的猜测。可以说这是目前不可能的。如果您想要某种类型的系统行为,则必须在类型系统中写入它。看起来像
索引访问或条件类型,它们可能非常复杂并且具有边缘案例。