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.

@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[]
```

@category Improved builtin
*/

Rule catalog ID: R034

Further readingโ€‹

Adoption resourcesโ€‹