ã¿ã€ããå®çŸ©ãããšãã |
åºåãããè€æ°ã®æ°å€ãæå®ã§ããŸãã
type TTerminalColors = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15;
åæ°å€ãäžèŠ§è¡šç€ºãã代ããã«ãæ°å€ã¿ã€ããç¯å²ãšããŠæå®ã§ããããã«ããŸãã
type TTerminalColors = 0..15;
type TRgbColorComponent = 0..255;
type TUInt = 0..4294967295;
ãã¶ããæŽæ°ã«ã¯..
ã䜿çšããæµ®åå°æ°ç¹æ°ã«ã¯...
ã䜿çšããŸãã
interface Math {
random(): 0...1
}
ãã®ã¢ã€ãã¢ã¯æåã«æ¡åŒµã§ããŸããããšãã°ã "b".."d"
ã¯"b" | "c" | "d"
ãŸãã æåã»ãããæå®ããæ¹ãç°¡åã§ãã
ããã¯æ¡åŒµããŠãHaskellã®ç¯å²ã®ãããªæ§æãã»ãã³ãã£ã¯ã¹ã䜿çšã§ãããšæããŸãã
| æ§æ| è±ç³|
| -------------------------- | ---------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------------------------------------ |
| type U = (e1..e3)
| type U = \| e1 \| e1+1 \| e1+2 \| ...e3 \|
e1 > e3
å ŽåããŠããªã³ã¯never
ã§ã|
| type U2 = (e1, e2..e3)
| type U2 = \| e1 \| e1+i \| e1+2i \| ...e3 \|
ã
ããã§ãå¢åi
ã¯e2-e1
ã§ãã
å¢åãæ£ãŸãã¯ãŒãã®å Žåã次ã®èŠçŽ ãe3
ãã倧ãããªããšããŠããªã³ã¯çµäºããŸãã
e1 > e3
å Žåãåéåã¯never
ã§ãã
å¢åãè² ã®å Žåã次ã®èŠçŽ ãe3
æªæºã«ãªããšããŠããªã³ã¯çµäºããŸãã
e1 < e3
å ŽåããŠããªã³ã¯never
ã§ãã |
@panuhorsmalahti "bb".."dd"
ãæå®ãããšã©ããªããŸããïŒ
@streamich
ãã¶ããæŽæ°ã«ã¯..ã䜿çšããæµ®åå°æ°ç¹æ°ã«ã¯...ã䜿çšããŸãã
ãã®ãããªæŽæ°åãçæãããšããã¢ã€ãã¢ã¯æ¬åœã«å¥œãã§ãããæµ®åå°æ°ç¹å€ãã©ã®ããã«æ©èœãããããããŸããã
@aluanhaddad確çãèšãïŒ
type TProbability = 0.0...1.0;
@streamichã§ããã®ã¿ã€ãã«ã¯çè«çã«ç¡éã®æ°ã®å¯èœãªäœæ°ãããŸããïŒ
@aluanhaddadã¯ãå®éã«ã¯IEEEæµ®åå°æ°ç¹ã§ç¡éã«ã¯ã»ã©é ãã§ãããã ç§ã®èšç®ã§ã¯ã1,065,353,217人ã®äœæ°ãããã§ãããã
0.0...1.0
ïŒ JSã¯IEEEdoubleã䜿çšããŸããããã¯ã53ãããã®ãã€ãããã¯ã¬ã³ãžã§ãã ããããµããŒãããããšããããç¯å²ã¯ãã¡ãŒã¹ãã¯ã©ã¹ã®åã§ãªããã°ãªããããããçµåã«è±ç³ããããšã¯éçŸå®çã§ã¯ãããŸããã
@jcreadyã¯ç¢ºãã§ããã @ fatcerberusãææããŠããããã«ããããå ±çšäœåãšããŠå®çŸããããšã¯éåžžã«åºå€§ã§ãã
ç§ãåŸãŠããã®ã¯ãåããã©ãæ¹æ³ã§ããããèšèªã«é¢æ£åãšé£ç¶åã®æŠå¿µãå°å ¥ãããšããããšã§ããã
å ±çšäœåãšããŠãããå®çŸããããšã¯ãæ³å€ã«åºå€§ã§ãã
@aluanhaddadã¯ãããã ãã笊å·ãªãæŽæ°ãåéåãšããŠæå®ããããšã§ãããéåžžã«ã³ã¹ããããããŸãã
type TUInt = 0..4294967295;
ä»æ¥ã®ãŠããªã³ã®å®è£ ã¯ãããã»ã©å€§ããªãŠããªã³ãå®çŸããã«ã¯ãŸã£ããé©ããŠããªããããããã«ã¯ããã€ãã®èª¬åŸåã®ãããŠãŒã¹ã±ãŒã¹ãæ¬åœã«å¿ èŠã§ãã ãã®ãããªããšãæžãããã©ããªãã
type UInt = 0..4294967295;
var x: UInt = ......;
if (x !== 4) {
x;
}
å
±çšäœå0 | 1 | 2 | 3 | 5 | 6 | 7 | ...
ã®ã€ã³ã¹ã¿ã³ã¹åã«ãªããŸãã
ãããããããã¯æ°å€ãªãã©ã«ã«å¯ŸããŠã®ã¿æ©èœããå¯èœæ§ããããŸãã ãªãã©ã«ä»¥å€ã®æ°å€ã¯ãç¯å²å
ã«ååšãããšèŠãªãããåã«ãæ¯èŒããã倧ãã/å°ããå€ã§æ瀺çã«èª¿æŽããå¿
èŠããããŸãã æŽæ°ç¯å²ã«ã¯ãè¿œå ã®Number.isInteger()
ãã§ãã¯ãå¿
èŠã«ãªããŸãã ããã«ãããå®éã®å
±çšäœåãçæããå¿
èŠããªããªããŸãã
@RyanCavanaughæžç®ã¿ã€ãïŒ ð
åŠå®åãååŠå®ã
æåå以å€ã®ãã®ïŒ
type NotAString = !string;
ãŒã以å€ã®ä»»æã®æ°ïŒ
type NonZeroNumber = number & !0;
@streamichæžç®ã¿ã€ãã¯ïŒ4183ã§ã«ããŒãããŠããŸã
ç§ã®ãŠãŒã¹ã±ãŒã¹ã¯æ¬¡ã®ãšããã§ãããã©ã¡ãŒã¿ã0ãŸãã¯æ£ã®æ°ïŒé åã€ã³ããã¯ã¹ïŒãšããŠå ¥åããããšæããŸãã
@RoyTinkerããã¯ééããªãã¯ãŒã«ã ãšæããŸããããã®ãŠãŒã¹ã±ãŒã¹ãè°è«ã«åœ¹ç«ã€ãã©ããã¯ããããŸããã
é
åã¯åãªããªããžã§ã¯ãã§ãããæé ã®ã€ã³ããã¯ã¹ã¯åãªãæ
£äŸã§ãã
let a = [];
for (let i = 0; i > -10; i -= 1) {
a[i] = Math.random() * 10;
}
ãããã£ãŠãæçµçã«ã¯åããã§ãã¯ãå®è¡ããå¿ èŠããããŸã
function withItem<T>(items: T[], index: number, f: (x: T) => void) {
if (items[index]) {
f(items[index]);
}
}
ç§ãåãæãæ¥ãæãªã©ã®ã¿ã€ããå®çŸ©ããã®ã«éåžžã«åœ¹ç«ã¡ãŸãã
@Frikkiãããã®ãŠãããã¯ååã«å¶éãããééã«ãããããæã§æžãã®ã¯å®çšçã§éåžžã«å°é£ã§ãã
type Hour =
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
| 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23;
@aluanhaddadããããunsigned intã¯ãããŸããïŒ
type UInt = 0..4294967295;
ããããã®ãããªã¿ã€ãã¯ã©ãã§ããïŒ
type Factorial<N extends number> = N > 2 ? Factorial<N - 1> * N : N;
type F1 = Factorial<1>; // 1
type F2 = Factorial<2>; // 1 | 2
type F3 = Factorial<3>; // 1 | 2 | 6
type FN = Factorial<number>; // 1 | 2 | 6 | ...
@ aleksey-bykovã³ã¡ã³ãã®*
æŒç®åã®äœ¿çšïŒ
type char = 0..255;
type word = char ** 2;
type int = word ** 2;
type bigint = int ** 2;
@streamichãããã«ãŠã³ãã2åã«ããããšã¯ã2ã®ä¹ç®ã«å¯Ÿå¿ããŸãããããã¯ãææ°ãšããŠ2ã䜿çšããã¹ãä¹ã«äŒŒãŠããŸãã ãã ããäžéãåŒãäžããã¹ãã§ã¯ãªãããããŸã æ£ãããããŸãããããšã³ã³ãŒãå¯èœãªæ°å€ã¯éèŠã§ãã å šäœãšããŠãããã¯è¯ãå®çŸ©æŠç¥ã§ã¯ãããŸããã
@streamich ãããã€ãã®ã³ã¡ã³ãïŒ
char
ã word
ãªã©ã®çšèªã䜿çšãããšãä»ã®èšèªã®äººã
ãéçå®çŸ©ãšå®è¡æã®åäœã®éãã«æ°ä»ããªãå¯èœæ§ããããããæ··ä¹±ããå¯èœæ§ããããŸããåã·ã¹ãã ã®ãã¥ãŒãªã³ã°ãå®äºãããŠã Ctrl + Shift + B
éãããšãã®åæ¢åé¡ã楜ããã§ã¿ãŸãããã
@ aleksey-bykov確ãã«ããªãã¯ãã®çŽ æŽãããåé¡ãèŠããŠããŸãð
@aluanhaddad
ãããã®åäœ[æéåäœ]ã¯ååã«å¶éãããééã«ãããããæã§æžãããšã¯å®çšçã§éåžžã«å°é£ã§ãã
https://github.com/Microsoft/TypeScript/issues/15480#issuecomment -349270853
ããŠãããªç§ã§ãããè¡ããŸãïŒwinkïŒ
ãã®åé¡ã¯æ»ãã§ããŸããïŒ
@Palidããã¯[Needs Proposal]
ã¿ã°ä»ããããŠããã®ã§ãç§
è°è«ã¯æ¥œãããã®ã§ããããç§ãã¡ã®ã»ãšãã©ã¯ã説åŸåã®ããå®éã®ãŠãŒã¹ã±ãŒã¹ãæäŸã§ããŠããŸããã
https://github.com/Microsoft/TypeScript/issues/15480#issuecomment-324152700ãåç §ããŠ
__ãŠãŒã¹ã±ãŒã¹ïŒ__
TypeScriptã®ãµãã»ãããWebAssemblyãŸãã¯ãã®ä»ã®ã¿ãŒã²ããã«ã³ã³ãã€ã«ã§ããããã«ãæ£ç¢ºãªintåãå®çŸ©ã§ããŸãã
å¥ã®äœ¿çšäŸã¯ã UInt8Array
ã Int8Array
ã Uint16Array
ãªã©ã§ãããããã®TypeScriptããããŒã¿ãèªã¿æžããããšããšã©ãŒããã§ãã¯ãããå¯èœæ§ããããŸãã
const ab = new ArrayBuffer(1e3);
const uint8 = new UInt8Array(ab);
uint8[0] = 0xFFFFFFFF; // TSError: Number too big!
OPã§ããã€ãã®ãŠãŒã¹ã±ãŒã¹ã«ã€ããŠèª¬æããŸããã
ãããå®è£ ãããšãTypeScriptã³ãã¥ããã£ã¯äœçŸäžãã®ãŠãŒã¹ã±ãŒã¹ãæãä»ãã§ãããã
ç§ã¯æ¬åœã«é¢çœããŠãŒã¹ã±ãŒã¹ãæã£ãŠããŸããããã¯å®éã«ããã§ææ¡ãããä»ã®ãã®ã«è¿ããããããŸããã
APIã¯ããç¯å²ïŒç§ã®å Žåã¯5-30ïŒã®éã®æŽæ°ãåãããã®ããã®SDKãå®è£
ããå¿
èŠããããŸãã
äžã«æåã§æžã蟌ãããšã¯ã25åã®å€ã«å¯ŸããŠïŒå°ãèªååããããšã¯ã§ããŸããïŒé¢åã§ãããæ°çŸãŸãã¯æ°åã¯ã©ãã§ããããïŒ
type X = 5 | 6 | 7 | 8 | 9 | 10 ... | 30
@Palidããã¯ããã®æ©èœã«ã€ããŠç§ãèŠãäžã§æãç°¡åãªã±ãŒã¹ã§ãã
以äžã®ãããªç¯å²ãªãã°5..30
ããã®ã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒãšããŠå®çŸ©ããã5 | 6 | 7 ... | 30
ïŒåæ§ã«ããããŸã§ãŸãã¯æ©èœïŒç§ã¯ãããã¯ç°¡åã«åã€ã ããè³ããŸãã ããã§ã¯ãæŽæ°ã®é¢æ£ç¯å²ãè¡šããŸãã
ãããããïŒé¢æ£ã§ã¯ãªãïŒé£ç¶ç¯å²ã¯ãããªãªãä»ãã®æ°å€ïŒ 5.0..30.0
ïŒã䜿çšããŠè¡šèšã§ããŸãã
ç§ã¯å®éã«TypescriptãèŠãŠã¿ã€ãã³ã°ä¿è·ãå®è£
ããããšãæ€èšããŠããŸãã
https://www.npmjs.com/package/memory-efficient-object
ç¯å²ã¿ã€ãã³ã°ã䜿çšãããšãã¿ã€ããã§ãã¯æã«æœåšçãªã¡ã¢ãªãªãŒããŒãããŒãç°¡åã«èŠã€ããããšãã§ããŸãã
ãŠããªã³æ¡åŒµã¯å®éã«ã¯å¿ èŠãªãããã§ãããç¯å²ãæ¯èŒããã ãã®å æ¬ç/æä»çç¯å²å®çŸ©ã®ããã§ã
type TTerminalColors = int & [0,15];
// int && v >= 0 && v <= 15
ããã¯ãé床ã0ã255ã®ç¯å²ã®ã¢ãŒã¿ãŒãå¶åŸ¡ããå ŽåïŒããšãã°ãJohnny-Fiveã䜿çšïŒã«éåžžã«åœ¹ç«ã¡ãŸãã
å¥ã®äœ¿çšäŸïŒTypeScriptã䜿çšããŠCanvasããŒã¹ã®æç»ããã°ã©ã ãå®è£ ããŠããŠãäžéæ床ïŒ0.0ã1.0ã®æ°å€ã§ããå¿ èŠããããŸãïŒã®åãã§ãã¯ãè¡ããããšèããŠããŸãã
èããŠããã ãã§ã...ãããé©åã«å®è£ ããã«ã¯ãæ¬åœã«ãã¹ãŠãå°œããå¿ èŠããããŸãã
x <= 10
ãããªæ¡ä»¶ã®åã®çµã蟌ã¿string | number
ç¯å²ïŒä»¥éx == 5
ããtrue
ã®ããã«x === "5"
æ°ã®ã¿ã®ç¯å²ã«å ããŠïŒint
ã¿ã€ãïŒ number
ãµãã¿ã€ãïŒã®ãµããŒããããã³int
ã®ã¿ãšstring | int
ç¯å²ã®ãµããŒãã§ãã ãŸãã x|0
ãããªåŒã®çµã蟌ã¿ãå
¥åããŸãçŽ æŽãããã¢ã€ãã¢ã§ããããããã«ããŒããã®ã¯å€§å€ã§ãïŒ
ãã¶ããã©ã³ã¿ã€ã ã¿ã€ãã¬ãŒãã¯å¿ èŠãããŸããã 代ããã«ãã³ã³ãã€ã«æããã£ãšã¬ãŒãããããšãã§ããŸã
ããã«ã¯ã代ããã«è€éãªåå²äºæž¬ãå¿ èŠã«ãªããŸã
ä»®å®ãã
type TTerminalColors = int & [0,15];
function A(color: TTerminalColors):void
{
}
A(15); // OK
var x = 15;
A(x); // OK
function B(value: int) : void
{
A(value); // ERROR!!!
if(value >= 0 && value <= 15)
A(value); // OK, because we check that it is in the range of TTerminalColors
}
function C(value: int) : void
{
if(value < 0)
value = 0;
if(value > 15)
value = 15;
A(value); // OK, because is clamped. But maybe too hard to implemented
}
function ClampInt(value: int): TTerminalColors
{
if(value >= 0 && value <= 15)
return value; // Same as B(int)
if(value > 15)
return 15;
return 0;
}
ç§ã®ãŠãŒã¹ã±ãŒã¹ïŒ
export const ajax: (config: AjaxOptions) => void;
type Callback = Success | Error;
type Success = (data: any, statusText: string, xhr: XMLHttpRequest) => void;
type Error = (xhr: XMLHttpRequest, statusText: string) => void;
interface AjaxOptions {
// ...
statusCode: { [code: number]: Callback | Callback[] },
// ...
}
statusCode
ãªãã·ã§ã³ã®ããŒãå¶éããŠãã³ã³ãã€ã«æã«ã¹ããŒã¿ã¹ã³ãŒããæåã³ãŒããŸãã¯ãšã©ãŒã³ãŒãã«å¯Ÿå¿ãããã©ãããå€æã§ããããã«ãããšäŸ¿å©ã§ãã
interface AjaxOptions {
// ...
statusCode: {
200..300: Success,
400..600: Error
},
// ...
}
IMOããã¯ãæµ®åå°æ°ç¹æ°ãšæŽæ°ã«å¶éããå¿ èŠããããå ±çšäœãšããŠå®è£ ããã®ã§ã¯ãªããæ°ããç¯å²ã¿ã€ããšããŠå®è£ ããå¿ èŠããããŸãã ãã®å Žåãåãã§ãã¯ã¯æ¬¡ã®ããã«ç°¡åã«ãªããŸãã
if (val >= range.start && val < range.end) {
return match;
} else {
return no_match;
}
ç§ãã¡ã¯ããããããRubyã®æ¬ããèãåãã䜿çšããããšãã§ããŸã..
å
æ¬ç¯å²ã«ã€ããŠïŒ [start, stop]
ïŒãš...
éå
æ¬çç¯å²ã«ã€ããŠã¯ïŒ [start, stop)
ïŒã
ãã1ã€ã®äœ¿çšäŸã¯ãããŒã¿ããŒã¹ã¬ã³ãŒããã¿ã€ããã§ãã¯ããããšã§ãã
ãã1ã€ã®äœ¿çšäŸã¯ãLat / Lonå€ã®åãã§ãã¯ã§ãã
ããã¯ãïŒ8665ã®äžè¬çãªæ€èšŒã¡ã«ããºã ã§ã«ããŒã§ããŸãïŒéè€ãšããŠéããããçç±ã¯ããããŸããïŒã
type TTerminalColors (n: number) => Math.floor(n) == n && n >= 0 && n <= 15;
type TRgbColorComponent (n: number) => Math.floor(n) == n && n >= 0 && n <= 255;
type TUInt (n: number) => n >= 0 && n <= 0..4294967295;
ãŸãã¯ãïŒ4639ã§ååŸãã笊å·ãªãæŽæ°åãuint
ãšããŠå®çŸ©ãããŠãããšä»®å®ããŸãã
type TTerminalColors (n: uint) => n <= 15;
type TRgbColorComponent (n: uint) => n <= 255;
ç§ã®ãŠãŒã¹ã±ãŒã¹ã¯ã°ããŒãã«åº§æšã§ãã 緯床ãšçµåºŠãå ¥åããŠãç¹å®ã®ç¯å²ïŒ-90ãã90ããã³-180ãã180ïŒã«ã®ã¿åãŸãããã«ããŸãã
ç·šéïŒlatãšlongã¯è² ã®ç¯å²ãæã£ãŠããŸã
ç§ã®ãŠãŒã¹ã±ãŒã¹ã¯ããµã€ãºããã©ã¡ãŒã¿ãŒã§ããåºå®ãµã€ãºã®é åã®å®è£ ã§ãã
ããšãã°ãé·ã2ã®æååã®é åã®åãå®çŸ©ããããšæããŸãã
let d: FixedSizeArray<2, string>;
d = [ 'a', 'b' ]; // ok
d = [ 'a' ]; // type error
d = [ 'a', 'b', 'c' ]; // type error
d[0] = 'a1'; // ok
d[1] = 'b1'; // ok
d[2] = 'c1' // type error
TSã®çŸåšã®ããŒãžã§ã³ã§ã¯ãäžèšã®ãä»æ§ãã«éåžžã«è¿ããã®ãå®çŸ©ããããšãå¯èœã§ãã äž»ãªåé¡ã¯ã¡ã³ããŒã¢ã¯ã»ã¹ã§ããããšãã°ã d[1] = 'b1'
ã¯ãæ£ããå Žåã§ãã¿ã€ããšã©ãŒãè¿ããŸãã ãšã©ãŒãåé¿ããããã«ããã¹ãŠã®æ£åœãªã€ã³ããã¯ã¹ã®ãªã¹ããFixedSizeArray
ã®å®çŸ©ã«æåã§ã³ã³ãã€ã«ããå¿
èŠããããŸãããããã¯éå±ã§ãã
range
æŒç®åã«äŒŒãkeyof
æŒç®åãããå Žåã次ã®åå®çŸ©ã§åé¡ã解決ã§ããŸãã
type FixedSizeArray<U extends number, T> = {
[k in range(U)]: T;
} & { length: U };
ããã§ã range(N)
ã¯range(0,N)
ã·ã§ãŒãã«ããã§ãã
äžããããæ°å€ãªãã©ã«ïŒããã¥ã©ã«ïŒMãNãM <Nã
type r = range(M, N);
ãšåçã§ã
type r = M | M+1 | ... | N-1
ããäžè¬çãªã®ã¯ãè¿°èªã©ã ããå®çŸ©ããŠããããåãšããŠäœ¿çšã§ãããã©ããã§ãã äŸïŒ
predicate mypredicate = (x) => x > 1 && x < 10
let x: mypredicate = 11 // not ok
let x: mypredicate = 5 // ok
ã©ã ãã¯ãã§ã«å©çšå¯èœã§ãããããããã¯æ§æã®è€éããäœããªããŸããå¿
èŠãªã®ã¯ãã©ã ããåãšããŠäœ¿çšããæ©èœã ãã§ããåãã§ãã¯ã¯ããšã«ããåã¹ã¯ãªããåºæã§ãïŒãJavascriptãžã®ã¹ãŒããŒã»ãããã®å²åŠã念é ã«çœ®ããŠãã ããïŒ
çæã¯ãè¿°èªã®è€éãããã£ãŒãããã¯ãæäŸããããã®ããŒã«ã®ããã©ãŒãã³ã¹ã決å®ãããšããããšã§ãã
æ°å€/æåãçå·®æ°åã«å±ããããšã確èªããããšã¯ãäžè¬çãªãŠãŒã¹ã±ãŒã¹ãšããŠé©ããŠããŸãã
// a is the starting element d is the difference between two elements and L is the last element
const belongsToAP = (a, d, L) => {
return (x) => {
if(x < a || x > L) return false
let n = ((x-a)/d) + 1
if(Number.isInteger(n)) return true
return false
}
}
ããã«ããã次ã®ãããªåãã§ãã¯ãå®è¡ã§ããŸãã
è¿°èªbelongsToMyAP = BelongsToAPïŒ1,1ã10ïŒ
let x : belongsToMyAP = 5 // ok
let y : belongsToMyAP = 7.2 // not ok
ããã¯æåã«ãæ¡åŒµã§ããŸãã
@Kasahsããã«äŒŒããã®ãïŒ8665ã§ãã§ã«ææ¡ãããŠããŸãã
ãAPIãåæ ããããŠãŒã¹ã±ãŒã¹ã§ç§ã®å€ããæå ¥ããŸãã ç§ãã©ãããŒé¢æ°ãæžããŠããRESTãšã³ããã€ã³ãã¯ãåŒæ°ãšããŠ1..1000ã®ç¯å²ã®æŽæ°ãåããŸãã æ°å€ããã®å¶çŽãæºãããªãå Žåããšã©ãŒãçæãããŸãã
ã ããç§ã¯æ°å€ç¯å²ã®ææ¡ãæžããŠããŸãããããŠç§ã¯ã©ã察åŠããã¹ããããããªããã®åé¡ã«åºããããã®ã§ãç§ã¯ãããæ€èšã®ããã«ããã«æãåºããŸãã
TypeScriptã³ã³ãã€ã©ã¯TypeScriptã§èšè¿°ãããŠãããããæ°å€æŒç®åã®ããããã£ãå©çšããŠç¯å²ã¿ã€ããå€æŽããããšãã§ããŸãã
// Syntax: x..y for an inclusive integer range.
let x: 0..10 = randomNumber(0, 10);
let y = x + 2; // Can deduce that y: 2..12.
ããã¯ãæ°ããå€æ°ã«å²ãåœãŠãå Žåã¯åé¡ãããŸãããããã¥ãŒããŒã·ã§ã³ã«ã€ããŠã¯ã©ãã§ããããã
let x: 0..10 = randomNumber(0, 10);
x += 2; // Error: 2..12 is not assignable to type 0..10 (upper bound is out of range).
ãã®ãšã©ãŒã¯æè¡çã«ã¯æ£ããã§ãããããå®éã«ã¯ã察åŠããã®ã¯éåžžã«é¢åã§ãã ç¯å²æ»ãåãæã€é¢æ°ã«ãã£ãŠè¿ãããå€æ°ãå€æŽããå Žåã¯ãåžžã«åã¢ãµãŒã·ã§ã³ãè¿œå ããå¿ èŠããããŸãã
let x = randomNumber(0, 10) as number; // If randomNumber doesn't return a type assigable to number
// this will be an error, but it would still be annoying to have to sprinkle "as number"
// expressions everywhere.
ãããŠããããç¡èŠãããšã次ã®ãããªäžå¥å šããçããŸãã
function logNumber0To10 (n: 0..10): void {
console.log(n);
}
let x: 0..10 = randomNumber(0, 10);
x += 2; // Because we're ignoring mutations, x: 0..10, but the runtime value could be 11 or 12,
// which are outside the specified range...
logNumber0To10(x); // ...which means we lose type safety on this call.
ããã«å¯Ÿããä¿®æ£ã¯ã宣èšåŸã«å€æ°ã®åãå€æŽããæ©èœã§ãããããäŸ2ã§ã¯xã®åã2..12ã«å€æŽããã ãã§ãã ããããç§ã®æåã®æ¬èœã¯ãã³ã³ãã€ã©ã§ã¯ãããŸãã«ãå€ãã®ãªãŒããŒããããå°å ¥ãããšããŠãŒã¶ãŒã«æ··ä¹±ããããšã§ãã
ãããŠããŠãŒã¶ãŒå®çŸ©ã®é¢æ°ãšãžã§ããªãã¯ã¯ã©ãã§ããïŒ
// How to define this return type, seeing as we can't do math in types?
function increment<L extends number, H extends number> (x: L..H): (L + 1)..(H + 1);
äžèšã«å¯ŸåŠããæ¹æ³ã«ã€ããŠäœãèãã¯ãããŸããïŒ
@JakeTunaley
çªç¶å€ç°ã¯ã©ãã§ããïŒ
çªç¶å€ç°ãä»ã®å²ãåœãŠãšç°ãªãå¿ èŠãããã®ã¯ãªãã§ããïŒ
ãããç§ã®è¬èãªææ¡ã®è©Šã¿ã§ãã ãã®ææ¡ã§ã¯ãä»ã®ã¿ã€ãã®è¿œå ãèŠæ±ãããŠããŸãã
Infinity
ã¿ã€ãInfinity
-Infinity
ã¿ã€ã-Infinity
NaN
ã¿ã€ãNaN
double
ã¿ã€ã[-Number.MAX_VALUE, Number.MAX_VALUE]
ãŸãã¯[-1.7976931348623157e+308, 1.7976931348623157e+308]
ã®ç¯å²å
ã®ãã¹ãŠã®number
å€number
ã¯Infinity|-Infinity|NaN|double
int
ã¿ã€ãdouble
ãµãã¿ã€ã[Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER]
ãŸãã¯[-9007199254740991, 9007199254740991]
ãšMath.floor(x) === x
ã®ç¯å²ã®ãã¹ãŠã®number
å€x
Math.floor(x) === x
3
ãš3.0
å€ã¯int
ã¿ã€ãã«ãªããŸã1
ã 3.141
ã 45
double
ãŸãã¯int
ãµãã¿ã€ãã§ããå¯èœæ§ããããŸã(>= x)
è¡šããããGtEqãã¿ã€ãx
ã¯æéãªãã©ã«ã Infinity
ããŸãã¯-Infinity
(<= x)
è¡šããããLtEqãã¿ã€ãx
ã¯æéãªãã©ã«ã Infinity
ããŸãã¯-Infinity
(> x)
è¡šããããGtãã¿ã€ãx
ã¯æéãªãã©ã«ã Infinity
ããŸãã¯-Infinity
(< x)
è¡šããããLtãã¿ã€ãx
ã¯æéãªãã©ã«ã Infinity
ããŸãã¯-Infinity
(>= x)
(>= Infinity) = Infinity
(>= -Infinity) = -Infinity|double|Infinity
Infinity
ã¯(>= [finite-literal])
ãµãã¿ã€ãã§ã(>= [finite-literal])
ã¯double|Infinity
ãµãã¿ã€ãã§ã(>= NaN) = never
(>= int) = (>= -9007199254740991)
(>= double) = (>= -1.7976931348623157e+308)
(>= number) = number
(> x)
(> Infinity) = never
(> -Infinity) = double|Infinity
Infinity
ã¯(> [finite-literal])
ãµãã¿ã€ãã§ã(> [finite-literal])
ã¯double|Infinity
ãµãã¿ã€ãã§ã(> NaN) = never
(> int) = (> -9007199254740991)
(> double) = (> -1.7976931348623157e+308)
(> number) = number
(<= x)
(<= Infinity) = -Infinity|double|Infinity
(<= -Infinity) = -Infinity
-Infinity
ã¯(<= [finite-literal])
ãµãã¿ã€ãã§ã(<= [finite-literal])
ã¯-Infinity|double
ãµãã¿ã€ãã§ã(<= NaN) = never
(<= int) = (<= 9007199254740991)
(<= double) = (<= 1.7976931348623157e+308)
(<= number) = number
(< x)
(< Infinity) = -Infinity|double
(< -Infinity) = never
-Infinity
ã¯(< [finite-literal])
ãµãã¿ã€ãã§ã(< [finite-literal])
ã¯-Infinity|double
ãµãã¿ã€ãã§ã(< NaN) = never
(< int) = (< 9007199254740991)
(< double) = (< 1.7976931348623157e+308)
(< number) = number
(>= Infinity)
ã (> number)
ãªã©ãæžãããšã¯ã§ããŸããã
çµæã®ã¿ã€ãã¯ç¯å²ã¿ã€ãã§ã¯ãããŸããã ãããã¯ä»ã®ã¿ã€ãã®åãªããšã€ãªã¢ã¹ã§ãã
ç¯å²ã¿ã€ãã¯ã
(>= [finite-literal])
(> [finite-literal])
(<= [finite-literal])
(< [finite-literal])
(> number)
ãªã©ã®æ§æããžã§ããªãã¯ã§äœ¿çšã§ããããã«ããŸãã
2ã€ã®GtEq / Gtã¿ã€ãã®åéåãåããšããmoreãå€ãæã€ã¿ã€ããçµæã«ãªããŸãã
(>= [finite-literal-A]) | (>= [finite-literal-B]) = ...
[finite-literal-A] >= [finite-literal-B]
å Žåãçµæã¯(>= [finite-literal-B])
(>= [finite-literal-A])
(>= 3) | (>= 5.5) = (>= 3)
(>= 3)
ã¯(>= 5.5)
ã¹ãŒããŒã¿ã€ãã§ããããã (>= [finite-literal-A]) | (> [finite-literal-B]) = ...
[finite-literal-A] == [finite-literal-B]
å Žåãçµæã¯(>= [finite-literal-A])
[finite-literal-A] > [finite-literal-B]
å Žåãçµæã¯(> [finite-literal-B])
(>= [finite-literal-A])
(> [finite-literal-A]) | (> [finite-literal-B]) = ...
[finite-literal-A] >= [finite-literal-B]
å Žåãçµæã¯(> [finite-literal-B])
(> [finite-literal-A])
(> 3) | (> 5.5) = (> 3)
(> 3)
ã¯(> 5.5)
ã¹ãŒããŒã¿ã€ãã§ããããã ãŸãã
(>= A|B) = (>= A) | (>= B)
(> A|B) = (> A) | (> B)
(> 4|3) = (> 4) | (> 3) = (> 3)
(> number|3) = (> number) | (> 3) = number | (> 3) = number
2ã€ã®LtEq / Ltåã®åéåãåããšããmoreãå€ãæã€åãçµæã«ãªããŸãã
(<= [finite-literal-A]) | (<= [finite-literal-B]) = ...
[finite-literal-A] <= [finite-literal-B]
å Žåãçµæã¯(<= [finite-literal-B])
(<= [finite-literal-A])
(<= 3) | (<= 5.5) = (<= 5.5)
(<= 5.5)
ã¯(<= 3)
ã¹ãŒããŒã¿ã€ãã§ããããã (<= [finite-literal-A]) | (< [finite-literal-B]) = ...
[finite-literal-A] == [finite-literal-B]
å Žåãçµæã¯(<= [finite-literal-A])
[finite-literal-A] < [finite-literal-B]
å Žåãçµæã¯(< [finite-literal-B])
(<= [finite-literal-A])
(< [finite-literal-A]) | (< [finite-literal-B]) = ...
[finite-literal-A] <= [finite-literal-B]
å Žåãçµæã¯(< [finite-literal-B])
(< [finite-literal-A])
(< 3) | (< 5.5) = (< 5.5)
(< 5.5)
ã¯(< 3)
ã¹ãŒããŒã¿ã€ãã§ããããã (< 3) | (< 5.5) = (< 5.5)
(< 3)
ãŸãã
(<= A|B) = (<= A) | (<= B)
(< A|B) = (< A) | (< B)
(< 4|3) = (< 4) | (< 3) = (< 4)
(< number|3) = (< number) | (< 3) = number | (< 3) = number
2ã€ã®GtEq / Gtã¿ã€ãã®å ±ééšåããšããšããå°ãªããå€ã®ã¿ã€ããçµæã«ãªããŸãã
(>= [finite-literal-A]) & (>= [finite-literal-B]) = ...
[finite-literal-A] >= [finite-literal-B]
å Žåãçµæã¯(>= [finite-literal-A])
(>= [finite-literal-B])
(>= 3) & (>= 5.5) = (>= 5.5)
(>= 5.5)
ã¯(>= 3)
ãµãã¿ã€ãã§ããããã (>= [finite-literal-A]) & (> [finite-literal-B]) = ...
[finite-literal-A] == [finite-literal-B]
å Žåãçµæã¯(> [finite-literal-B])
[finite-literal-A] > [finite-literal-B]
å Žåãçµæã¯(>= [finite-literal-A])
(> [finite-literal-B])
(> [finite-literal-A]) & (> [finite-literal-B]) = ...
[finite-literal-A] >= [finite-literal-B]
å Žåãçµæã¯(> [finite-literal-A])
(> [finite-literal-B])
(> 3) & (> 5.5) = (> 5.5)
(> 5.5)
ã¯(> 3)
ãµãã¿ã€ãã§ããããã 2ã€ã®LtEq / Ltã¿ã€ãã®å ±ééšåããšããšããå°ãªããå€ã®ã¿ã€ããçµæã«ãªããŸãã
(<= [finite-literal-A]) & (<= [finite-literal-B]) = ...
[finite-literal-A] <= [finite-literal-B]
å Žåãçµæã¯(<= [finite-literal-A])
(<= [finite-literal-B])
(<= 3) & (<= 5.5) = (<= 3)
(<= 3)
ã¯(<= 5.5)
ãµãã¿ã€ãã§ããããã (<= [finite-literal-A]) & (< [finite-literal-B]) = ...
[finite-literal-A] == [finite-literal-B]
å Žåãçµæã¯(< [finite-literal-B])
[finite-literal-A] < [finite-literal-B]
å Žåãçµæã¯(<= [finite-literal-A])
(< [finite-literal-B])
(< [finite-literal-A]) & (< [finite-literal-B]) = ...
[finite-literal-A] <= [finite-literal-B]
å Žåãçµæã¯(< [finite-literal-A])
(< [finite-literal-B])
(< 3) & (< 5.5) = (< 3)
(< 3)
ã¯(< 5.5)
ãµãã¿ã€ãã§ããããã (< 3)
(< 5.5)
æŽæ°ãMySQL UNSIGNED INT
ããŒã¿åã«åãŸãããã«éçã«ä¿èšŒããã«ã¯ã
//TODO Propose numeric and range sum/subtraction/multiplication/division/mod/exponentiation types?
function insertToDb (x : int & (>= 0) & (<= 4294967295)) {
//Insert to database
}
æååãæå®ãããé·ãã§ããããšãéçã«ç¢ºèªããã«ã¯ã
function foo (s : string & { length : int & (>= 1) & (<= 255) }) {
//Do something with this non-empty string that has up to 255 characters
}
é
åã®ãããªãªããžã§ã¯ãã«é©åãªlength
å€ãããããšãéçã«ç¢ºèªããã«ã¯ã
function foo (arr : { length : int & (>= 0) }) {
//Do something with the array-like object
}
æéæ°ã®ã¿ãäžããããããšãéçã«ä¿èšŒããããã«ã
function foo (x : double) {
//`x` is NOT NaN|Infinity|-Infinity
}
é åã€ã³ããã¯ã¹ãååšããããšãéçã«ç¢ºèªããã«ã¯ïŒ
function foo (arr : { [index : int & (>= 0) & (< 10)] : string }) {
console.log(arr[0]); //OK
console.log(arr[1]); //OK
console.log(arr[2]); //OK
console.log(arr[9]); //OK
console.log(arr[10]); //Error
}
æ°å€ãšç¯å²ã®å ç®/æžç®/ä¹ç®/é€ç®/ mod /ã¹ãä¹ã®ã¿ã€ããææ¡ãããã®ã§ãããããã¯ãã®åé¡ã§ã¯ç¯å²å€ã®ããã§ãã
[ç·šé]
ããªãã¯ãååã®å€æŽãã§ãdouble
ãããããåŒã³åºãfloat
ãç§ã¯ã¡ããã©ãšæã£double
ããæ£ç¢ºã«ãããã¯å粟床浮åå°æ°ç¹æ°ã§ããããšãè¡šããŸãã
[ç·šé]
äžéšã®ã¿ã€ããnever
ã
ã³ã³ãã€ã©ã«ãããŒåæãè¡ãããããšã¯å¯èœã§ããããïŒ
ãã®é¢æ°ããããšããŸããã
function DoSomething(x : int & (>= 0) & (< 10)){
// DoSomething
}
function WillError(x : int){
DoSomething(x); // error; x is not >= 0 & < 10
}
function WillNotError(x : int){
if(x >= 0 && x < 10)
DoSomething(x); // not error by flow analysis
}
ãã1ã€ã®ãŠãŒã¹ã±ãŒã¹ïŒããŒã»ã³ããŒãžãè¡šãé¢æ°ãžã®æ°å€å ¥åããããŸãã å€ã0ãã1ã®éã«å¶éãããã
[...Array(256)].map((_,i) => i).join("|")
ãå®è¡ããŠããããŸã§ã§æãéãåå®çŸ©ãäœæããŸãã
éè² ã®æŽæ°ãšå°ããæ°ãå¯èœã§ãïŒ
type ArrayT<T> = T extends (infer P)[] ? P : never;
type A = ArrayT<Range<5, 10>>;//5|6|7|8|9|10
ç¯å²ïŒhttps ïŒ//github.com/kgtkr/typepark/blob/master/src/list.ts
ãå°ããæ°ããšã¯ãã¹ããŒãž3ã䜿çšããªãããšãæå³ããŸãBigInt
ïŒ
@Mouvediaã³ã³ãã€ã©ã®ååž°å¶éå ã«åãŸãæ°å€
ãã¶ããæŽæ°ã«ã¯..ã䜿çšããæµ®åå°æ°ç¹æ°ã«ã¯...ã䜿çšããŸãã
..
ã¯å
æ¬çç¯å²ãæå³ãã ...
æä»çã§ããã¹ãã ãšæããŸãã ããšãã°Rubyã®ããã«ã http://rubylearning.com/satishtalim/ruby_ranges.htmlãåç
§ããŠãã ãã
ç§ã¯ãå æ¬çç¯å²ãšæä»çç¯å²ãåºå¥ããããã«åäžã®æéã䜿çšããã®ã奜ãã§ã¯ãããŸãã
é£ã³èŸŒãããšã¯ã§ããŸããïŒ åæå®ã®åäžã®æ¡åŒµãšããŠèŠããããã®æ©èœã¯ãããã«è¡ãããã®æè¯ã®æ¹æ³ã§ã¯ãªãå¯èœæ§ãé«ããšæããŸãã
type range = 1:2:Infinity // 1, 3, 5⊠Infinity
ããã¯ãå€ãã®4glãã©ãããã©ãŒã ãç¹ã«ãããªãã¯ã¹æåã®ãã©ãããã©ãŒã ã§æ°å€ç¯å²ãå®çŸ©ããæ¹æ³ã§ãã
åäžãªç¯å²ã¯åŸæ¥ãæè¯ã®ã¢ããªã³ã°ææ³ã®1ã€ã§ããããããã®æ¹æ³ã§è¡ããŸãã
ãããã£ãŠãé 次ç¯å²ã¯æ¬¡ã®ãšããã§ãã
type decmials = 1:10 // like 1 .. 10 with all decimals in between
ãããŠæŽæ°ã ãã®å ŽåïŒ
type integers = 1:1:10 // 1, 2, 3, 4, 5, 6, 7, 8, 10
// OR
type integers = number.integers<1:10>
æ§æããããããå ŽåïŒ
type something = 1::10 // whatever use cases need today
ãããããŒã¯ãã€ã¶ãŒã«é©ããŠããªãå Žåãããã¯ç§ã®æèŠã§ã¯ããã«çŠç¹ãåœãŠãæ£ããããããã³ã°åªå é äœã§ã¯ãããŸããã ç§ã¯ããã解決çã次ã®è§£æ±ºçã«ãã©ãçãã®ãå¶éããªãããšãæãã§ããããšãææããŸãã
ç·šéïŒç§ã説æã§ããªãã®ã¯å æ¬æ§ã®åŽé¢ã§ãâãããŠããã§ããã¹ãŠã®æ°å€ãæé»çã«å«ãåäžãªç¯å²ã«äŸåããå€ãã®åé¡ã人ã ã解決ãããšãã«ããªããããåé¡ã§ã¯ãªãã£ãã®ããç解ããã®ã«ååãªãã¥ãŒããªãžã§ã³ã¹ãè¡ã£ãŠãããã©ããçåã«æãå¿ èŠããããŸãå¢åãç¯å²ã®çµãããšæ£ç¢ºã«äžèŽããªãã£ãå Žåãé€ããŸãã
ç¯å²ã¿ã€ãã§ãã¹ãããããµã€ãºãå®çŸ©ã§ããããã«ãªãã®ã¯èå³æ·±ãããšã§ãã
ãæµ®åå°æ°ç¹ãïŒåºå®ã¹ããããµã€ãºãªãïŒãšãæŽæ°ãïŒã¹ããããµã€ãº1ãæŽæ°ããéå§ïŒã®ç¯å²ãè¶ ããŠãä»ã®ã¹ããããµã€ãºã®ç¯å²ã®å®éã®ãŠãŒã¹ã±ãŒã¹ã«ééããããšã¯ãããŸããã
ããã§ããããä»ã®å Žæã®ãã®ã§ãããšèãã®ã¯èå³æ·±ãã§ãã ä»ãŸã§èããããšããªãã®ã§ã4glã«ã€ããŠåŠã¶å¿ èŠããããŸãã
ããŒããªãŒãã³ééãå®çŸ©ã§ãããšãé åã®ãããªãªããžã§ã¯ãã«åœ¹ç«ã¡ãŸãã äœãã®ãããªãã®ã
interface SaferArray<T, LengthT extends integer & (>= 0)> {
length : LengthT;
[index in integer & (>= 0) & (< LengthT)] : T
}
å
æ¬çç¯å²ãããªãå Žåã¯ã (<= LengthT - 1)
ãå¿
èŠã«ãªããŸãããããã¯ããŸããšã¬ã¬ã³ãã§ã¯ãããŸããã
é£ã³èŸŒãããšã¯ã§ããŸããïŒ åæå®ã®åäžã®æ¡åŒµãšããŠèŠããããã®æ©èœã¯ãããã«è¡ãããã®æè¯ã®æ¹æ³ã§ã¯ãªãå¯èœæ§ãé«ããšæããŸãã
type range = 1:2:Infinity // 1, 3, 5⊠Infinity
ããã¯ãå€ãã®4glãã©ãããã©ãŒã ãç¹ã«ãããªãã¯ã¹æåã®ãã©ãããã©ãŒã ã§æ°å€ç¯å²ãå®çŸ©ããæ¹æ³ã§ãã
åäžãªç¯å²ã¯åŸæ¥ãæè¯ã®ã¢ããªã³ã°ææ³ã®1ã€ã§ããããããã®æ¹æ³ã§è¡ããŸãã
ãããã£ãŠãé 次ç¯å²ã¯æ¬¡ã®ãšããã§ãã
type decmials = 1:10 // like 1 .. 10 with all decimals in between
ãããŠæŽæ°ã ãã®å ŽåïŒ
type integers = 1:1:10 // 1, 2, 3, 4, 5, 6, 7, 8, 10 // OR type integers = number.integers<1:10>
æ§æããããããå ŽåïŒ
type something = 1::10 // whatever use cases need today
ãããããŒã¯ãã€ã¶ãŒã«é©ããŠããªãå Žåãããã¯ç§ã®æèŠã§ã¯ããã«çŠç¹ãåœãŠãæ£ããããããã³ã°åªå é äœã§ã¯ãããŸããã ç§ã¯ããã解決çã次ã®è§£æ±ºçã«ãã©ãçãã®ãå¶éããªãããšãæãã§ããããšãææããŸãã
ç·šéïŒç§ã説æã§ããªãã®ã¯å æ¬æ§ã®åŽé¢ã§ãâãããŠããã§ããã¹ãŠã®æ°å€ãæé»çã«å«ãåäžãªç¯å²ã«äŸåããå€ãã®åé¡ã人ã ã解決ãããšãã«ããªããããåé¡ã§ã¯ãªãã£ãã®ããç解ããã®ã«ååãªãã¥ãŒããªãžã§ã³ã¹ãè¡ã£ãŠãããã©ããçåã«æãå¿ èŠããããŸãå¢åãç¯å²ã®çµãããšæ£ç¢ºã«äžèŽããªãã£ãå Žåãé€ããŸãã
ããŒããHaskellã§ã®åŠçæ¹æ³ã®ããã«èŠããŸãã ããã¯ãããšæããŸãã ãžã§ãã¬ãŒã¿ãŒã¯é 延è©äŸ¡ãå¯èœã«ããŸãã
ä»ã®æ§æ= xã§é 延è©äŸ¡ãè¡ãããšãã§ããªãããã§ã¯ãããŸãã
ç¯å²ã¿ã€ãã§ãã¹ãããããµã€ãºãå®çŸ©ã§ããããã«ãªãã®ã¯èå³æ·±ãããšã§ãã
ç¯å²ã¯ãéå§ãçµäºãããã³å¢åãšèããŠããŸãã ãããã£ãŠãå¢åãæ£ç¢ºã«æåŸãŸã§åæšäºå
¥ãããå Žåã¯ããããå«ãŸããŸãã ç¯å²é¢æ°ãšããŠã®é
åã®ã€ã³ããã¯ã¹ãšé·ãã¯ãé
åã«ããããšãã§ããŸã0ïŒ1ïŒ9ã«ã¯10åã®ã€ã³ããã¯ã¹ã¹ãããïŒé·ãïŒããããŸãã ãããã£ãŠãããã§ã®ç¯å²ã¯ãããã2ã€ã®åŒã®çµã¿åããããããç°¡åã«æšæž¬ã§ããåã·ã¹ãã ã®å Žåã䟿å©ãªããšã«integer & 0:9
ã«ãªããŸãã
4GLã¯æ¬åœã«äžè¬çãªã©ãã«ã§ãããç§ã«ãšã£ãŠã¯ã»ãšãã©ãMatLabã§ããã
ç§ã®ãã€ã³ãã¯ãå æ¬çç¯å²ãããªãå Žåããžã§ããªãã¯ã¹ã§ã®äœ¿çšãé£ãããªããšããããšã§ããïŒããã¯ã®ãããªåã¬ãã«ã®æ°åŠæŒç®ãå®è£ ããªãéãïŒã
ãªããªããã¿ã€ããã©ã¡ãŒã¿ãšããŠãé·ããã ãã䜿çšããã®ã§ã¯ãªããé·ããšæ倧ã€ã³ããã¯ã¹ãå¿ èŠã«ãªãããã§ãã ãŸããæ倧ã€ã³ããã¯ã¹ã¯é·ã-1ã«çãããªããã°ãªããŸããã
ãããŠãç¹°ãè¿ããŸããããããã®ããã¯ã®ãããªã¿ã€ãã¬ãã«ã®æ°åŠæŒç®ãå®è£ ããªãéããå®éã«ãããåœãŠã¯ãŸããã©ããã確èªããããšã¯ã§ããŸããã
@AnyhowStepç§ã¯ããªãã®æžå¿µã
å æ¬çãŸãã¯ããã§ãªããã®ãn-1åé¡ïŒãã®ã€ã³ããã¯ã¹/ã«ãŠã³ãã·ããªãªãªã©ïŒã«ç¹ã«é©çšã§ãããã®ãšã¯å¥ã«ããŠããããäœããã®æ¹æ³ã§ç¬ç«ããŠè§£æ±ºããããšä»®å®ãããšïŒèãããŠãŒã¢ã¢ã亀ããŠïŒãæ°å€ç¯å²ãããã§ããé©åã«èª¬æããããã«ã宣èšåããã³/ãŸãã¯åç Žããªæ§æãå¿ èŠã§ããïŒ
ç§ã¯ãããã2ã€ã®å¥ã ã®åŽé¢ã§ããããšã«æ°ã¥ããŠããŸããããªãã¯ãã®ãã¡ã€ã³ã®æåŸ ã«åŸæ¥éãæŽåãããŠããæ°å€ç¯å²ãå¿ èŠãšãããããŠããªãã¯ãŸãã€ã³ããã¯ã¹/ã«ãŠã³ãã¿ã€ãã®è¿°èªãå¿ èŠãšããŸã...ãªã©ã
æ£ã®æ°ã®ã¿ã
declare let x : (> 0);
x = 0.1; //OK
x = 0.0001; //OK
x = 0.00000001; //OK
x = 0; //Error
x = 1; //OK
x = -1; //Error
å æ¬çã®ã¿ã®ç¯å²ã§ã
declare let x : epsilon:epsilon:Infinity; //Where epsilon is some super-small non-zero, positive number
Infinity
ãé€ãæ£ã®æ°ã
declare let x : (> 0) & (< Infinity);
å æ¬çã®ã¿ã®ç¯å²ã§ã
const MAX_FLOAT : 1.7976931348623157e+308 = 1.7976931348623157e+308;
declare let x : epsilon:epsilon:MAX_FLOAT;
ãŸããçŸåšã®è°è«ãšã¯é¢ä¿ãããŸããããæ°å€ç¯å²ã¿ã€ããæ¬åœã«å¿ èŠãªãã1ã€ã®çç±ããããŸãã
ç§ã®æ¥åžžã®ä»äºã®å€ãã¯ãããŸããŸãªãœãããŠã§ã¢ã·ã¹ãã ãçµã¿åãããããšã§ãã ãããŠããããã®ã·ã¹ãã ã®å€ãã¯ãåãæå³ãæã€ããŒã¿ã«å¯ŸããŠç°ãªãèŠä»¶ãæã£ãŠããŸãã
äŸïŒïŒsystemAã1ã255ã®å€ïŒãïŒsystemBã3ã73ã®å€ïŒãªã©ã
äŸïŒïŒsystemCãæååã®é·ã7-88ïŒãïŒsystemDãæååã®é·ã9-99ïŒãïŒsystemEãæååã®é·ã2-101ïŒãªã©ã
ä»ã®ãšãããããããã¹ãŠã®åå¥ã®èŠä»¶ã泚ææ·±ãææžåããããã·ã¹ãã ã®ããŒã¿ãå¥ã®ã·ã¹ãã ã«æ£ãããããã³ã°ã§ããããšã確èªããå¿ èŠããããŸãã ããããããªãå Žåã¯ãåé¿çãèŠã€ããå¿ èŠããããŸãã
ç§ã¯äººéã ãã§ãã ç§ã¯å€±æããã ããŒã¿ããããã³ã°ã§ããªãããšãããããšã«æ°ã¥ããŠããŸããã ç¯å²ãã§ãã¯ã¯å€±æããŸãã
æ°å€ç¯å²ã¿ã€ãã䜿çšãããšãæçµçã«ãåã·ã¹ãã ãæåŸ ããç¯å²ã宣èšããã³ã³ãã€ã©ãŒã«ãã§ãã¯ãä»»ããããšãã§ããŸãã
ããšãã°ã䜿çšããŠããAPIã§ããã¹ãŠã®æååå€ã«å¯ŸããŠ10kã®æååé·å¶éããããšããç¶æ³ãçºçããŸããã ãããšãAPIã«éããããã¹ãŠã®æååã10kæªæºã®æååé·ã§ããããšã確èªããããã«TypeScriptã«æ瀺ããæ¹æ³ããããŸããã§ããã
TSãè¡ãå¯èœæ§ã®ããçŽ æŽãããã³ã³ãã€ã«ãšã©ãŒã§ã¯ãªããå®è¡æãšã©ãŒãçºçããŸããã
`string` is not assignable to `string & { length : (<= 10000) }`
@AnyhowStepç§ã®æå³ã¯ããæ°å€ã¿ã€ããšããŠã®ç¯å²ããšåŒã°ãããã®ããããäžè¬çãªãŠãŒã¶ãŒïŒã€ãŸããç¯å²ãééãããå æ¬æ§ã匷調ããçç±ãçåã«æã£ãŠããTSã«ç§»åãã人ïŒã«å¯Ÿããäžè¬çãªæåŸ ãšåçŽã«äžèŽããããšã確èªããããšã ãã§ããããšãç解ããŠããã ããã°å¹žãã§ãã
æ£çŽãªãšããããŠãŒã¹ã±ãŒã¹ã¯åžžã«æ©èœãæšé²ããå¿ èŠããããšæããŸããã€ã³ããã¯ã¹ãšé·ãã«é¢ããåé¡ã¯ãç§ãã¡ã®å€ããæã æ¬åœã«èŠéããŠããåé¡ã ãšæããŸãã ã ããç§ã¯åã«æ£ããã©ãã«ã®äžã§ãã®åé¡ã«å¯ŸåŠãããã®ã§ãâããã¯æ°åã¿ã€ãã®ãã®ã§ããããããšãã€ã³ããã¯ã¹ã¿ã€ãã®ãã®ã§ããïŒ æ£ç¢ºãªçãã¯ããããŸããããæ°åãšããŠè§£ããŠããåãããã«ç解ããŠããªãæ°åãŠãŒã¶ãŒã«ãšã£ãŠã¯ããã£ããããŠåé¡ãå¢ããããšã¯ãªããšæããŸãã
ããã§ããã®ãããªåé¡ãä¿®æ£ããããšã誰ã«ãšã£ãŠãæå³ãããä»ã®å Žæã¯ããã®æç¹ã§ç§ãçåã«æã£ãŠãããã¹ãŠã§ããèãïŒ
ãã€ãé åãæž¡ãAPIãæ±ã£ãŠããã®ã§ããã€ãã¿ã€ããå®çŸ©ããããšæããŸãã
type byte = 0x00..0xFF
type bytes = byte[]
ããã¯ã Uint8Array
ãããšãã«ã圹ç«ã¡ãŸãã
ããªããç§ã®ããã§ãçŸæç¹ã§å®éã«äœ¿çšã§ããç¯å²ã¿ã€ããååŸããããšã«å®éã®ç¯å²ã¿ã€ãã®ã³ãŒãã¹ããããããããŸãã
TL; DRã
ç¯å²ã¿ã€ããæ©èœããããã«ãªããŸãã
interface CompileError<_ErrorMessageT> {
readonly __compileError : never;
}
///////////////////////////////////////////////
type PopFront<TupleT extends any[]> = (
((...tuple : TupleT) => void) extends ((head : any, ...tail : infer TailT) => void) ?
TailT :
never
);
type PushFront<TailT extends any[], FrontT> = (
((front : FrontT, ...tail : TailT) => void) extends ((...tuple : infer TupleT) => void) ?
TupleT :
never
);
type LeftPadImpl<TupleT extends any[], ElementT extends any, LengthT extends number> = {
0 : TupleT,
1 : LeftPad<PushFront<TupleT, ElementT>, ElementT, LengthT>
}[
TupleT["length"] extends LengthT ?
0 :
1
];
type LeftPad<TupleT extends any[], ElementT extends any, LengthT extends number> = (
LeftPadImpl<TupleT, ElementT, LengthT> extends infer X ?
(
X extends any[] ?
X :
never
) :
never
);
type LongerTuple<A extends any[], B extends any[]> = (
keyof A extends keyof B ?
B :
A
);
///////////////////////////////////////////////////////
type Digit = 0|1|2|3|4|5|6|7|8|9;
/**
* A non-empty tuple of digits
*/
type NaturalNumber = Digit[];
/**
* 6 - 1 = 5
*/
type SubOne<D extends Digit> = {
0 : never,
1 : 0,
2 : 1,
3 : 2,
4 : 3,
5 : 4,
6 : 5,
7 : 6,
8 : 7,
9 : 8,
}[D];
type LtDigit<A extends Digit, B extends Digit> = {
0 : (
B extends 0 ?
false :
true
),
1 : false,
2 : LtDigit<SubOne<A>, SubOne<B>>
}[
A extends 0 ?
0 :
B extends 0 ?
1 :
2
];
//false
type ltDigit_0 = LtDigit<3, 3>;
//true
type ltDigit_1 = LtDigit<3, 4>;
//false
type ltDigit_2 = LtDigit<5, 2>;
/**
* + Assumes `A` and `B` have the same length.
* + Assumes `A` and `B` **ARE NOT** reversed.
* So, `A[0]` is actually the **FIRST** digit of the number.
*/
type LtEqNaturalNumberImpl<
A extends NaturalNumber,
B extends NaturalNumber
> = {
0 : true,
1 : (
LtDigit<A[0], B[0]> extends true ?
true :
A[0] extends B[0] ?
LtEqNaturalNumberImpl<
PopFront<A>,
PopFront<B>
> :
false
),
2 : never
}[
A["length"] extends 0 ?
0 :
number extends A["length"] ?
2 :
1
];
type LtEqNaturalNumber<
A extends NaturalNumber,
B extends NaturalNumber
> = (
LtEqNaturalNumberImpl<
LeftPad<A, 0, LongerTuple<A, B>["length"]>,
LeftPad<B, 0, LongerTuple<A, B>["length"]>
> extends infer X ?
(
X extends boolean ?
X :
never
) :
never
);
//false
type ltEqNaturalNumber_0 = LtEqNaturalNumber<
[1],
[0]
>;
//true
type ltEqNaturalNumber_1 = LtEqNaturalNumber<
[5,2,3],
[4,8,9,2,3]
>;
//false
type ltEqNaturalNumber_2 = LtEqNaturalNumber<
[4,8,9,2,3],
[5,2,3]
>;
//true
type ltEqNaturalNumber_3 = LtEqNaturalNumber<
[5,2,3],
[5,2,3]
>;
//true
type ltEqNaturalNumber_4 = LtEqNaturalNumber<
[5,2,2],
[5,2,3]
>;
//false
type ltEqNaturalNumber_5 = LtEqNaturalNumber<
[5,1],
[2,5]
>;
//false
type ltEqNaturalNumber_6 = LtEqNaturalNumber<
[2,5,7],
[2,5,6]
>;
type RangeLt<N extends NaturalNumber> = (
number &
{
readonly __rangeLt : N|undefined;
}
);
type StringLengthLt<N extends NaturalNumber> = (
string & { length : RangeLt<N> }
);
type AssertStringLengthLt<S extends StringLengthLt<NaturalNumber>, N extends NaturalNumber> = (
LtEqNaturalNumber<
Exclude<S["length"]["__rangeLt"], undefined>,
N
> extends true ?
S :
CompileError<[
"Expected string of length less than",
N,
"received",
Exclude<S["length"]["__rangeLt"], undefined>
]>
);
/**
* String of length less than 256
*/
type StringLt256 = string & { length : RangeLt<[2,5,6]> };
/**
* String of length less than 512
*/
type StringLt512 = string & { length : RangeLt<[5,1,2]> };
declare function foo<S extends StringLengthLt<NaturalNumber>> (
s : AssertStringLengthLt<S, [2,5,6]>
) : void;
declare const str256 : StringLt256;
declare const str512 : StringLt512;
foo(str256); //OK!
foo(str512); //Error
declare function makeLengthRangeLtGuard<N extends NaturalNumber> (...n : N) : (
(x : string) => x is StringLengthLt<N>
);
if (makeLengthRangeLtGuard(2,5,6)(str512)) {
foo(str512); //OK!
}
declare const blah : string;
foo(blah); //Error
if (makeLengthRangeLtGuard(2,5,5)(blah)) {
foo(blah); //OK!
}
if (makeLengthRangeLtGuard(2,5,6)(blah)) {
foo(blah); //OK!
}
if (makeLengthRangeLtGuard(2,5,7)(blah)) {
foo(blah); //Error
}
ããããCompileError<>
ã¿ã€ãã䜿çšããŸãã
https://github.com/microsoft/TypeScript/issues/23689#issuecomment -512114782
AssertStringLengthLt<>
ã¿ã€ãã¯éæ³ãèµ·ããå Žæã§ã
ã¿ã€ãã¬ãã«ã®è¿œå ã䜿çšãããšã str512 + str512
ãååŸããŠã str1024
ãååŸã§ããŸãã
https://github.com/microsoft/TypeScript/issues/14833#issuecomment -513106939
@AnyhowStepãœãªã¥ãŒã·ã§ã³ãèŠããšãããè¯ãäžæçãªãœãªã¥ãŒã·ã§ã³ããããšæããŸãã ã¿ã€ãã¬ãŒããèŠããŠããŸããïŒïŒ
/**
* Just some interfaces
*/
interface Foo {
foo: number;
common: string;
}
interface Bar {
bar: number;
common: string;
}
/**
* User Defined Type Guard!
*/
function isFoo(arg: any): arg is Foo {
return arg.foo !== undefined;
}
/**
* Sample usage of the User Defined Type Guard
*/
function doStuff(arg: Foo | Bar) {
if (isFoo(arg)) {
console.log(arg.foo); // OK
console.log(arg.bar); // Error!
}
else {
console.log(arg.foo); // Error!
console.log(arg.bar); // OK
}
}
doStuff({ foo: 123, common: '123' });
doStuff({ bar: 123, common: '123' });
ãããã£ãŠã次ã®ã³ãŒããèŠãŠãã ããã
class NumberRange {
readonly min: number;
readonly max: number;
constructor(min:number, max:number, ) {
if (min > max) {
throw new RangeError(`min value (${min}) is greater than max value (${max})`);
} else {
this.min = min;
this.max = max;
}
}
public isInRange = (num: number, explicit = false): boolean => {
let inRange: boolean = false;
if (explicit === false) {
inRange = num <= this.max && num >= this.min;
} else {
inRange = num < this.max && num > this.min;
}
return inRange;
};
}
const testRange = new NumberRange(0, 12);
if(testRange.isInRange(13)){
console.log('yay')
}else {
console.log('nope')
}
ããã¯åãªãã¢ã€ãã¢ã§ãããã¿ã€ãã¬ãŒãã䜿çšãããšãç¯å²ã䜿çšã§ããŸãã
ããã§ã®åé¡ã¯ããããã§ããªãããšã§ãã
declare const a : number;
declare let b : (>= 5);
const testRange = new NumberRange(12, 20);
if (testRange.isInRange(a)) {
b = a; //ok
} else {
b = a; //compile error
}
ã¿ã€ãã¬ãŒãã ãã§ã¯æºè¶³ã®ãã解決çã§ã¯ãã
ãŸããããªãã®äŸã§ã¯ã¿ã€ãã¬ãŒããã䜿çšããŠããŸããã
äžèšã®ç§ã®ã°ãããããããŒãªããã¡ãã®äŸã§ã¯ãå¢çãä»ã®ç¯å²å ã«ããå Žåãç¯å²ã¿ã€ããå¥ã®ç¯å²ã¿ã€ãã«ïŒé¢æ°paramsãä»ããŠïŒå²ãåœãŠãããšãã§ããŸãã
ãŸããããªããã£ãã§äœ¿çšãããŠããã¿ã°ã¿ã€ãããããã«ã¿ã€ããããã³å€ãªããžã§ã¯ãã¯ãéåžžãåã·ã¹ãã ãååã«è¡šçŸåã«æ¬ ããŠããããšã瀺ããŠããŸãã
ã¿ã°ã¿ã€ãã䜿çšããæããªããã¡ãã®äŸã¯ãéåžžã«é人éçã§ãããããå«ãã§ãã ç¯å²ãããªããã£ãã§ããããšãã©ã®ããã«åªããŠãããã«ã€ããŠã¯ããã®é·ãã³ã¡ã³ããåç §ã§ããŸãã
https://github.com/microsoft/TypeScript/issues/6579#issuecomment -548249683
ããã¯ãçŸåšã®TypescriptããŒãžã§ã³ã§å®çŸã§ããŸãã
// internal helper types
type IncrementLength<A extends Array<any>> = ((x: any, ...xs: A) => void) extends ((...a: infer X) => void) ? X : never;
type EnumerateRecursive<A extends Array<any>, N extends number> = A['length'] extends infer X ? (X | { 0: never, 1: EnumerateRecursive<IncrementLength<A>, N> }[X extends N ? 0 : 1]) : never;
// actual utility types
export type Enumerate<N extends number> = Exclude<EnumerateRecursive<[], N>, N>;
export type Range<FROM extends number, TO extends number> = Exclude<Enumerate<TO>, Enumerate<FROM>>;
// usage examples:
type E1 = Enumerate<3>; // hover E1: type E1 = 0 | 1 | 2
type E2 = Enumerate<10>; // hover E2: type E2 = 0 | 1 | 3 | 2 | 4 | 5 | 6 | 7 | 8 | 9
type R1 = Range<0, 5>; // hover R1: type R1 = 0 | 1 | 3 | 2 | 4
type R2 = Range<5, 11>; // hover R2: type R2 = 10 | 5 | 6 | 7 | 8 | 9
å æ¬çéå§ã€ã³ããã¯ã¹ãšæä»ççµäºã€ã³ããã¯ã¹ã䜿çšãããšããèŠåã«åŸããŸããããå¿ èŠã«å¿ããŠèª¿æŽã§ããŸãã
vsã³ãŒãã®ãããŒãã³ãã¯ã³ã¡ã³ãã«ãããŸãã
ãããŒãã³ãã®æ°åãã©ã³ãã ã«äžŠã¹æ¿ããããŠããããšã«æ³šæããŠãã ããã
æ²ããããšã«ãããã¯çŽ10èŠçŽ ãŸã§ããæ©èœããŸãã:(
ç·šéïŒ Enumerate
ã¯æ倧15
ååž°ïŒ0ã14ïŒããåŠçã§ããªãããã§ã
@ Shinigami92
ãã®ã¢ãããŒãã§ã¯ãEnumerateã¯æ倧40ãåŠçããŸãã
ããã¯ãŸã å¶éã§ãããå®éã«ã¯ããã»ã©å³ãããªããããããŸããã
type PrependNextNum<A extends Array<unknown>> = A['length'] extends infer T ? ((t: T, ...a: A) => void) extends ((...x: infer X) => void) ? X : never : never;
type EnumerateInternal<A extends Array<unknown>, N extends number> = { 0: A, 1: EnumerateInternal<PrependNextNum<A>, N> }[N extends A['length'] ? 0 : 1];
export type Enumerate<N extends number> = EnumerateInternal<[], N> extends (infer E)[] ? E : never;
export type Range<FROM extends number, TO extends number> = Exclude<Enumerate<TO>, Enumerate<FROM>>;
type E1 = Enumerate<40>;
type E2 = Enumerate<10>;
type R1 = Range<0, 5>;
type R2 = Range<5, 34>;
ãããŠä»ãããã¯ããŸããŸéæ³ã®ããã«åé¡ãããŸãã;ïŒã
ç§ã®å
žåçãªãŠãŒã¹ã±ãŒã¹ã¯ã [1, 255]
ã [1, 2048]
ã [1, 4096]
ã [20, 80]
ãªã©ã®ç¯å²ã䜿çšããŸãã倧ããªå
±çšäœã¿ã€ããäœæãããšãTSãç°åžžçµäº/æžéããå¯èœæ§ããããŸãã ã ãããããããã®ãœãªã¥ãŒã·ã§ã³ã¯ééããªããããå°ããªãç¯å²ã§æ©èœããŸã
@AnyhowStep
ååž°ã«ãŠã³ããå¶éã§ããããšãç¥ã£ãŠããã®ã§ããããã®ç¯å²ãéæããããã«ãåå®çŸ©å
ã®åäžã®éååž°æäœã§2ã«ããæ°ã®é€ç®/ä¹ç®ãå®è¡ããæ¹æ³ãèŠã€ããå¿
èŠããããŸãã
ããã©ãŒãã³ã¹ã¯äŸç¶ãšããŠåé¡ã§ãã ãã®ããã以åã¯å€§ããªã¢ããªããæçšãªå ±çšäœåãéžå¥ããå¿ èŠããããŸãããããã¯èå³æ·±ãæŒç¿ãããããŸãããã解決çã§ã¯ãããŸããã
ç§ãæšæž¬ããå®ç§ãªè§£æ±ºçã¯ãŸã ãããŸãããïŒ
ç§ã¯ãããäžè¬çãªæ¹æ³ã§æ¬¡ã®ããã«ã§ããããšãé¡ã£ãŠããŸãïŒãããé£ããã§ããïŒã
type X => (number >= 50 && number > 60 || number = 70) || (string.startsWith("+"))
ïŒã€ãŸããå€æ°ãåã«çœ®ãæããããŠããããšãé€ããŠãéåžžã®javascriptã¹ããŒãã¡ã³ã/é¢æ°ãããã§äœ¿çšã§ããŸãïŒ
ç§ã®ç解ã§ã¯ãçŸä»£èª=éåžžã®è«ç+ã¡ã¿è«çãããã§ã¡ã¿è«ç=ã³ãŒããã§ãã¯+ã³ãŒãçæã å€ãã®äœåã¯ãã¡ã¿è«çæ§æããšã¬ã¬ã³ããªæ¹æ³ã§ããŒãžããããšããŠããã ãã§ãã
ã©ãããããããç¯å²ã¿ã€ããããçš®ã®ç ç³ã§ã¯ãªããã³ã¢ã³ã³ã»ããã§ãããšæ³å®ããããšãã§ããŸããïŒ
// number literal extend `number` despite the fact
// that `number` is not union of all number literals
type NumberLiteralIsNumber = 5 extends number ? true : false // true
// so if we will define Range (with some non-existing syntax which is clearly should be done in lib internals)
type Range<MIN extends number, MAX extends number> = MAX > MIN ? 5 and 2NaN : MAX === MIN ? MAX : MIN..MAX
// and assume that `number` is Range<-Infinity, +Infinity>
type NumberIsInfinitRange = number extends Range<-Infinity, +Infinity> ?
Range<-Infinity, +Infinity> extends number ? true : false :
false // true
// following things will be true
type AnyRangeIsNumber<T extends number, K extends Number> =
Range<T, K> extends number ? true : false // true
type NestedRangeIsNumber<T extends number, K extends number, S extends number> =
Range<T, Range<K, S>> extends number ? true : false // true
ãããå®äºããã«ã¯ãå Žåã«ãã£ãŠã¯åäœã宣èšããå¿ èŠããããŸã
Range<T, T> === T
Range<5, 1> === NaN
Range<NaN, T> === Range<T, NaN> === NaN
ãã®ãããªå€ã¯ååšã§ããŸããRange<1 | 2, 5> === Range<2, 5>
æåã®ã¿ã€ãã®ãã©ã¡ãŒã¿ãŒãç¯å²ãçãå¶éãããããæ°å€ã倧ãããªãå¯èœæ§ããããŸãRange<1, 4 | 5> === Range<1, 4>
2çªç®ã®ã¿ã€ãã®ãã©ã¡ãŒã¿ãŒãç¯å²ãçãããããã«å¶éãããããæ°å€ãå°ãããªãå¯èœæ§1.5 extends Range<1, 2>
ã¯å®çŸ©äžçã§ããå¿
èŠããããŸãRange<Range<A, B>, C> === NaN extends Range<A, B> ? NaN : Range<B, C>
ã¯5ãš3ããç¶ããŸãRange<A, Range<B, C>> === NaN extends Range<B, C> ? NaN : Range<A, B>
ã¯6ãš3ããç¶ããŸããããŠãç¯å²å ã®ç¯å²ã«ã€ããŠå°ãïŒ
type RangeIsInsideRange<T extends Range<any, any>, K extends Range<any, any>> =
T extends Range<infer A, infer B>
? K extends Range<infer C, infer D>
? NaN extends Range<A, C>
? false
: NaN extends Range<B, D>
? false
: true
: never
: never
ç¯å²ãµãã¿ã€ãã¯ãã¿ã€ãã¬ãã«ã®æ¯èŒé¢æ°(a: T, b: T) => '<' | '=' | '>'
ãšããŠãäžè¬çãªæ¹æ³ã§å®çŸ©ããããšãã§ããŸãã
...ã¿ã€ãã¬ãã«ã§éåžžã®JSé¢æ°ã䜿çšããããã®ææ¡ã¯ãããŸããïŒ
ææ¡ã¯ãããŸãããã以åã«ç°¡åãªãããã¿ã€ããäœæããŸããã æ®å¿µãªãããIDEã®ããã©ãŒãã³ã¹ãšå ¥åã®ãµãã¿ã€ãºã«ã¯å€§ããªæžå¿µããããŸãã
@yudinnsã®åé¡ã¯ãç¯å²ãå°ãªããšããã®ååã§ååšãããããæ··ä¹±ããå¯èœæ§ãããããšã§ããhttps ïŒ //developer.mozilla.org/en-US/docs/Web/API/rangeãåç
§ããŠãã ãããå®çŸ©ã§ããæ©èœããããŸããã <1, n+2>
ãããªæ°å-1ã€ä»¥äžã®è€éãªæ¹çšåŒããå§ãŸãã¹ããã2-1ã
ãã®TC39ææ¡ã¯ããããå®è£
ãããåã«ãããããã¹ããŒãž4ã«å°éããŸãã
ãã±ããã¯3æ³ã§ãã
ææ¡ïŒæ£èŠè¡šçŸã§æ€èšŒãããæååã¿ã€ãïŒ https ïŒ
ïŒé¢é£ããSOã®è³ªåïŒhttpsïŒ//stackoverflow.com/questions/3895478/does-javascript-have-a-method-like-range-to-generate-a-range-within-the-suppïŒ
number in range
ãããªããšãããããšãã§ããã°ãããã¯ãŒã«ã§ããããäŸãã°if 1 in 1..2
ãŸãã¯å
æ¬çif 1 in 1..=2
rustã¯ãããããŸãåŠçããŸãhttps://doc.rust-lang.org/reference/ expression /range-expr.html ã ããã¯å€ãã®ã¹ããŒã¹ãç¯çŽããã§ããã
Pythonãšrustã«ã¯ãã§ã«åä»ãç¯å²æ©èœããããŸãããïŒ
äž»ãªç®çãšæ倧ã®ãŠãŒã¹ã±ãŒã¹ã¯æ°å€ç¯å²ã§ãããè»èŒªã®åçºæãæååãæµ®åå°æ°ç¹æ°ãªã©ã§ç¹å¥ã«æ±çšåããã®ã§ã¯ãªããæ¢åã®ãœãªã¥ãŒã·ã§ã³ãä»ã®èšèªã§åå®è£
ããããšã¯ã§ããŸããïŒ åŸã§å¿
èŠã«å¿ããŠè¿œå ã§ããŸã
ç§ã¯ããã«äœåºŠãééãã0 ... 1ã®éã®åæ°ã§ããåãå®çŸ©ããæ¹æ³ãæ¢ãã«ããã«æ¥ãŸãã-ããã¯https://news.ycombinator.com/item?id=ã§è°è«ãããŠã24362658ïŒ24372935 ã typescriptãããã§åœ¹ç«ã€ã®ã§ããã°ãããã¯çŽ æŽãããããšã§ãããã¿ã€ãã¬ãã«ã§å®æœããã®ã¯éåžžã«é£ãããããããŸããã
@andrewphillipoãããè°è«ãããŠããã®ãèŠãŠãã¹ã¿ãã¯äº€æã«é¢ããåçã®1ã€ãããŠãããééãšããçšèªã«ã€ããŠåŠã³ãŸãããããã¯ãäžè¬çãªã³ã³ããã¹ãã§ãã®ç¹å®ã®ç¯å²ãåç §ããæ£ããæ¹æ³ã®ããã§ãã
åãšããŠã®ç¯å²ãtypescriptã§å®è£
ãããããšãããã°ãããããUnitInterval
ã°ããŒãã«åãšããŠå®çŸ©ããŠãããã°ã©ãã³ã°ã§é »ç¹ã«äœ¿çšãããã®ã«å
±éããåœåæ³ã奚å±ããããšãã§ããŸãã
ã¯ãUnitIntervalã¯ç¯å²0 ... 1ã®æ£ããååãªã®ã§ãã¿ã€ãã«é©ããŠããŸãïŒ ãŸã çªå·ã®ååãæ£ãããªãã®ã§ããã®ãããªåã䜿çšããŠã³ãŒããããæ£ç¢ºã«èšè¿°ããããã«ãããå©çšå¯èœã§ããã°ãããã¯åªããŠããŸã-ããã¯Rustã®åã·ã¹ãã ã®å éšã§ã©ã®ããã«æ©èœããŸãã-ããã¯åãªãèŠåå¡ã§ããïŒ
CantorSpace
ãããã»ã©å€§ãããªãå Žåãã³ã³ãã¥ãŒã¿ãŒã§ç解ãããããã«ã [0, 1]
éã®ããã¹ãŠã®ãå®æ°ã®ãç¯å²ãã®å
¬æ£ãªå®çŸ©ã«ãªããšæããŸãã ã³ã³ãã€ã«æã«ããããå€ã«å²ãåœãŠãããšã¯ã Math.ceil(0) === 0
以éã®javascriptã®Math.floor
ãŸãã¯Math.ceil
äžéãšäžéãããã³Math.floor(1) === 1
ã«ãã£ãŠæšæž¬ããããšã¯ã§ããŸãããæ®å¿µãªããã
ãã¹ãŠã®æ°å€ã®ã»ãã(0, 1)
ã代ããã«äœ¿çšãããå Žåãäžèšã®äŸã䜿çšããŠæ©èœããŸãããæ¥åžžã®èšèªã§ããŒã»ã³ããŒãžãšããŠåç
§ãããå€ãé€å€ããã®ã¯ã¡ãã£ãšæªãããšã§ãã å¯èœã§ããã°ãã³ã³ãã€ã©ã«å¢çãå«ãããšããšããžã±ãŒã¹0ãš1ã«å¯ŸããŠå³å¯ãª===
ãã§ãã¯ãè¡ãããšãã§ããŸãã
ãŸãã¯ãæŽæ°ã«ã¯1~~3
ã䜿çšããæµ®åå°æ°ç¹æ°ã«ã¯0.1~0.5
ã䜿çšããŸããïŒ
~
ã¯ãåé
ãããåäœã®NOTæŒç®åã«ãã£ãŠãã§ã«äœ¿çšãããŠããŸãã
ãªãç§ãã¡ããããã®ããŸããŸããå±±è»ã«ã€ããŠè©±ãå¿
èŠãããã®ãââãç§ãã¡ãæ±ããŠããåé¡ã¯æŽæ°ã«ãããŸãã 99.99ïŒ
ã¯æŽæ°ã®åé¡ã§ãã0.001ïŒ
ã¯æµ®åå°æ°ç¹ã®åé¡ã§ãã
äžè¬çãªè§£æ±ºçã¯ç°¡åã«ã¯ããåŸãªãã®ã§ãäœå¹Žãåã«ãã§ã«å®è£
ãããŠããããã«ãã»ãšãã©ã®ããã°ã©ãã³ã°èšèªã§èŠãããããã«ã0ãã10ã®æ°ã®ç¯å²ã«è¡ããŸãããã
ãããŒãã®è©±ããããªãã
ãã¶ããç§ãã¡ã¯æ³æ¡ãåå²ããintã®å Žåã«ãã®ææ¡ãæ¡åŒµããããšãã§ããŸãïŒ
https://gist.github.com/rbuckton/5fd81582fdf86a34b45bae82d842304c
ãããŠããããŒãã«ã€ããŠã¯ãçŸåšããã®å·ã®ããã€ãã®ã¢ã€ãã¢ã«åºã¥ããŠå¥ã®èšèšææ¡ã«åãçµãã§ããŸãïŒäž»ã«@AnyhowStepãåºæ¬çã«ã¯Open-Interval-Typeãæã€æ©èœïŒã
ã·ã³ãã«ã«ä¿ã€
x..y
ã¯æŽæ°ã®ã¿ã§ãã
0.1..2
ã¯ãšã©ãŒã«ãªããŸã
1..2.1
ããšã©ãŒã«ãªããŸã
ãããŠãæ€åºå¯èœãªéæŽæ°ã
ããå®è£
ããžãã¯ãã³ããŒããŸã
https://en.m.wikibooks.org/wiki/Ada_Programming/Types/range
ãŸãã¯
https://kotlinlang.org/docs/reference/ranges.html
ãŸãã¯
https://doc.rust-lang.org/reference/expressions/range-expr.html
ãããŠããã1æ¥ãšåŒã³ãŸãã
â
è»èŒªã®åçºæã®å¿
èŠã¯ãããŸãã
â
ãããŒããèæ
®ããå¿
èŠã¯ãããŸãã
â
èšèªéã®äžè²«æ§
â
æ¢åã®ãœãŒã¹ãããã¹ãæžã¿ã§ã³ããŒå¯èœãªå®å®ããã³ãŒã
åã®å€ããã¹ãŠã®åºå®æŽæ°0..1000ã®åéåãšããŠããŒãã³ãŒãã£ã³ã°ããããšã«ããã1000æªæºã®æ°å€ã®å ŽåããintãããŒã¹ã®åãã§ãã¯ã¯ç°¡åã§ãããããfloatã解決ããããã«åªåãã䟡å€ããããŸãã -è»èŒªã®åçºæãã¯å°ãç®èãªããšã§ãã åçŽãªãŠãŒã¹ã±ãŒã¹ã§ãã§ã«æ©èœããŠãããã®ã䜿çšããŠã¿ãŸãããïŒ
ç§ã¯ããããç¡çæ°ã®ãããªãã®ãç解ããåå®çŸ©ãå¯èœã«ããããã«ãããããã®äœå°ãããããšãæãã§ããŸãã ã©ãžã¢ã³ã䜿çšããå Žåãã³ã³ãã€ã«æã«äžå€æ¡ä»¶ãæ€åºããæ©èœã¯ãèå³æ·±ããŠãŒã¹ã±ãŒã¹ã«ãªããŸãã ç¯å²å€ã®å¢çãžã®åŒæ°ãšããŠÏããµããŒãããããšã¯ããã®æ©èœãæå³ããimoãšããŠæ©èœãããšäž»åŒµããããã®è¯ãã¿ãŒã²ããã§ãã
javascriptã«ã¯æ瀺çãªinteger
ããªãããšã«æ³šæããŠãã ããã ãã¹ãŠãnumber
ã§ãããæµ®åå°æ°ç¹æ°ãšããŠæ ŒçŽãããŸãã ç¯å²åæŒç®åãå®è£
ãããŠããå Žåã number
ãåŠçã§ãããã¹ãŠã®å€ãåŠçããå¿
èŠããããŸãã
explicit
ã®å®çŸ©ã«å¿ãã@aMoniker ïŒ BigInt
bigintã®å Žåã§ããbigintãMySQLã®ç¬Šå·ä»ã/笊å·ãªãbigintå ã«åãŸãããã«ãããªã©ããŠããªã³ã解決ã§ããªããŠãŒã¹ã±ãŒã¹ããããŸãã
ãã®æ©èœã®intrinsic
ç¯å²ã¿ã€ããäœæããã®ã¯ã©ãã§ããïŒ
lib.es5.d.ts
ïŒãŸãã¯bigintsã®ãµããŒããå«ããå Žåã¯lib.es2020.bigint.d.ts
ïŒtype GreaterThan<N extends number | bigint> = intrinsic
type GreaterThanOrEqualTo<N extends number | bigint> = GreaterThan<N> | N
type LessThan<N extends number | bigint> = intrinsic
type LessThanOrEqualTo<N extends number | bigint> = LessThan<N> | N
/**
* prevent `GreaterThan` and `LessThan` from desugaring
* (in the same way that `number` does _not_ desugar to `-Infinity | ... | Infinity`)
*/
type GreaterThanOrEqualTo2 = GreaterThanOrEqualTo<2>
type LessThan8 = LessThan<8>
type GreaterThanOrEqualTo2_And_LessThan8 = GreaterThanOrEqualTo2 & LessThan8
type LessThan2_Or_GreaterThanOrEqualTo8 = LessThan<2> | GreaterThanOrEqualTo<8> // inverse of `GreaterThanOrEqualTo2_And_LessThan8` (would be nice to be able to just do `Exclude<number | bigint, GreaterThanOrEqualTo2_And_LessThan8>` but that might be wishful thinking)
type LessThan2_And_GreaterThanOrEqualTo8 = LessThan<2> & GreaterThanOrEqualTo<8> // `never`
type GreaterThanOrEqualTo2_Or_LessThan8 = GreaterThanOrEqualTo2 | LessThan8 // `number | bigint`
type RangesAreNumbersOrBigIntsByDefault = LessThan8 extends number | bigint ? true : false // `true` (the user could always narrow this on a per-range basis, e.g. `LessThan8 & number`)
type RangesAcceptUnions = LessThan<7n | 7.5 | 8> // `LessThan<8>`
type RangesAcceptOtherRanges1 = LessThan<LessThan8> // `LessThan8`
type RangesAcceptOtherRanges2 = LessThan<GreaterThanOrEqualTo2> // `number | bigint`
type RangesSupportBeingInAUnion = (-6 | 0.42 | 2n | 2 | 3) | LessThan<2> // `LessThan<2> | 2n | 2 | 3`
type RangesSupportBeingInAnIntersection = (-6 | 0.42 | 2n | 2 | 3) & LessThan<2> // `-6 | 0.42`
type RangesSupportBeingInAUnionWithOtherRanges = LessThan<2> | LessThan8 // `LessThan8`
type RangesSupportBeingInAnIntersectionWithOtherRanges = LessThan<2> & LessThan8 // `LessThan<2>`
@RyanCavanaugh
ä»æ¥ã®ãŠããªã³ã®å®è£ ã¯ãããã»ã©å€§ããªãŠããªã³ãå®çŸããã«ã¯ãŸã£ããé©ããŠããªããããããã«ã¯ããã€ãã®èª¬åŸåã®ãããŠãŒã¹ã±ãŒã¹ãæ¬åœã«å¿ èŠã§ãã ããªãããã®ãããªäœããæžããå Žåã«èµ·ããã§ãããäœã...
以äžã¯ãintåããªããšäžå¥å šã«ãªããŸãã
const arr: string[] = ['a', 'b', 'c']
const item = arr[1.01] // Typescript inferred this as string but actually it is undefined
console.log(item) // Will print undefined, we miss inferred the type
次ã®ã¿ã€ãã䜿çšãããšããã®åé¡ãé²ãããšãã§ããŸãã
type TUInt = 0..4294967295;
Int32
ãšInt64
ã¿ã€ãã䜿çšããå¥ã®äœ¿çšäŸã¯ãç¹ã«äººã
ãã³ãŒãã«æ³šéãä»ãå§ãããšãã§ã...ä»ã®èšèªãšã®ããè¯ãçžäºéçšæ§ãžã®æãéããŸã...ã»ãšãã©ãã¹ãŠéçã«ã¿ã€ããããŸãèšèªã«ã¯æŽæ°åããããŸãïŒJavaãCïŒãCãRustãFïŒãGo ...ãªã©ã
ããšãã°ãCïŒããTypeScriptã§èšè¿°ãããnpmã©ã€ãã©ãªãåŒã³åºãããå ŽåãTypeScriptå®çŸ©ãååŸããCïŒã§ã€ã³ã¿ãŒãã§ã€ã¹ãäœæããã©ã€ãã©ãªããããŸãããåé¡ã¯number
ã¿ã€ããfloat
倧æåãšå°æåãåºå¥ããã«CïŒã§é
åã«ã€ã³ããã¯ã¹ãä»ããããã«äœ¿çšããããšã¯ã§ããŸãã...ãªã©ã
ãã®ä»ã®ãŠãŒã¹ã±ãŒã¹ïŒèšèªéã®ãã©ã³ã¹ãã€ã«ã®å®¹æããããã©ãŒãã³ã¹ã®æé©å...ãªã©
ããã圹ç«ã€ãã1ã€ã®ã±ãŒã¹ã¯ãéåžžã«æ瀺çãªåå¥ã®æ°å€ã¿ã€ããæã€WebAssemblyãšã®å¯Ÿè©±ã§ããããšã«æ³šæããŠãã ããïŒCïŒã®ãŠãŒã¹ã±ãŒã¹ãšããŠç°¡åã«èšåããããšæããŸããããããããã¯ããã«åºãé©çšãããããšãæ確ã«ãããã£ãã®ã§ãïŒã
UPDïŒNvmã httpsïŒ //github.com/microsoft/TypeScript/issues/15480#issuecomment -365420315ã§èšåãããŠããããã§ãããGithubã¯ãé ãã¢ã€ãã ããšããŠã䟿å©ã«ãé ããŠããŸãã
+1
æãåèã«ãªãã³ã¡ã³ã
ãã®ã¢ã€ãã¢ã¯æåã«æ¡åŒµã§ããŸããããšãã°ã
"b".."d"
ã¯"b" | "c" | "d"
ãŸãã æåã»ãããæå®ããæ¹ãç°¡åã§ãã