microsoft / TypeScript Public
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Enhance members of literal type like const array type (e.g. string literal types should have literal length property) #34692
Comments
Sounds like a duplicate of #34589. |
No, I don't think so - #34589 is about tuple types. This is about using literal types for the |
Would be nice to understand why this would be useful |
@RyanCavanaugh To implement a type detecting the edge-underscored string, I've also published a new issue #34844, hoping (Literal.length - 1) also be the constant value. However, I can't sure that I've requested exact features for the edge-underscored string. If I'm forgetting something important, please inform me. |
There is a lot of use cases One use case is asserting that a method is only called for a single character, mimicking the type SingleChar = string & { length: 1 };
const charCodeOf = (char: SingleChar): number => char.charCodeAt(0);
charCodeOf('a'); // Should work
charCodeOf('asdhfkj') // Should fail
charCodeOf('') // Should also fail Also prevent literal empty strings from being passed as arguments: type EmptyString = string & { length: 0 };
type SingleChar = string & { length: 1 };
const lastChar = (str: Exclude<string, EmptyString>): SingleChar => str[str.length - 1]!;
lastChar('abc'); // Should work
lastChar(''); // Should fail
// We could also better narrow the return types
const typedLastChar = <S extends string>(
str: S,
): S extends EmptyString ? undefined : SingleChar => str[str.length - 1];
const ch1: string = typedLastChar('qwe'); // should work
const ch2: string = typedLastChar(''); // should fail
const ch3: undefined = typedLastChar(''); // should work I'm sure there's others cases to type against fixed length strings (fixed length hashs maybe? or identifications cards?) In my opninion the proposal is a really good addition, it's amazing for typing DSLs and builders |
Another use case: currently some type level arithmetics leverage the fact that array length produces number literal. With template literal type, if Another example of type level arithmetics: Implementing Arithmetic Within TypeScript’s Type System But of course, the best solution is adding type Add<A extends number, B extends number> = intrinsic
type Subtract<A extends number, B extends number> = intrinsic
type Increment<A extends number> = Add<A, 1>
type Decrement<A extends number> = Subtract<A, 1> |
The const array type, its principle members are also be the constant. When define a const array
[number, string, boolean]
, itslength
type be3
. Also, when access to special index, the type also points the exact const type.However, the literal type is not like the const array. When define a literal type "something", its
length
be not9
butnumber
. Also, when access to a special index, the type is not a special literal type but astring
type.What about enhancing the literal type to be like the const array type?
The text was updated successfully, but these errors were encountered: