Skip to main content

prefer-ts-extras-string-split

Prefer stringSplit from ts-extras over string.split(...).

stringSplit(...) can preserve stronger tuple-like inference for literal separators.

Targeted pattern scopeโ€‹

This rule focuses on direct string.split(separator) calls that can be migrated to stringSplit(string, separator) with deterministic fixes.

  • string.split(separator) call sites that can use stringSplit(string, separator).

Alias indirection, wrapper helpers, and non-canonical call shapes are excluded to keep stringSplit(string, separator) migrations safe.

What this rule reportsโ€‹

This rule reports string.split(separator) call sites when stringSplit(string, separator) is the intended replacement.

  • string.split(separator) call sites that can use stringSplit(string, separator).

Why this rule existsโ€‹

stringSplit standardizes string tokenization and can preserve stronger typing for literal separators and known string shapes.

  • Split usage follows one helper style across modules.
  • Destructuring from split results is easier to type in strict code.
  • Native/helper split styles are not mixed.

โŒ Incorrectโ€‹

const parts = monitorKey.split(":");

โœ… Correctโ€‹

const parts = stringSplit(monitorKey, ":");

Behavior and migration notesโ€‹

  • Runtime behavior matches native String.prototype.split.
  • Separator semantics (string/regex, limits) are preserved.
  • Literal-based tuple inference depends on the source string and separator types.

Additional examplesโ€‹

โŒ Incorrect โ€” Additional exampleโ€‹

const [major, minor] = version.split(".");

โœ… Correct โ€” Additional exampleโ€‹

const [major, minor] = stringSplit(version, ".");

โœ… Correct โ€” Repository-wide usageโ€‹

const pathParts = stringSplit(route, "/");

ESLint flat config exampleโ€‹

import typefest from "eslint-plugin-typefest";

export default [
{
plugins: { typefest },
rules: {
"typefest/prefer-ts-extras-string-split": "error",
},
},
];

When not to use itโ€‹

Disable this rule if your code style standardizes on direct .split() usage.

Package documentationโ€‹

ts-extras package documentation:

Source file: source/string-split.ts

/**
* A strongly-typed version of `String#split()` that returns a tuple for literal
* strings.
*
* @category Improved builtin
*
* @example
* ```
* import {stringSplit} from 'ts-extras';
*
* const parts = stringSplit('foo-bar-baz', '-');
* //=> ['foo', 'bar', 'baz']
* // ^? ['foo', 'bar', 'baz']
*
* const [first, second] = stringSplit('top-left', '-');
* //=> first: 'top', second: 'left'
*
* const placement = 'top-start' as const;
* const side = stringSplit(placement, '-')[0];
* //=> 'top'
* // ^? 'top'
*
* // Dynamic strings return string[]
* const dynamic: string = 'a-b-c';
* const dynamicParts = stringSplit(dynamic, '-');
* //=> string[]
* ```;
*/

Rule catalog ID: R034

Further readingโ€‹

Adoption resourcesโ€‹