μμ±λ νλμ νμΌμ μ μΈνκ³ λ΄ νλ‘μ νΈμ λͺ¨λ TypeScript νμΌμ "ν΄λμ€ μ΄λ¦" κ·μΉ μ μ¬μ©νκ³ μΆμ΅λλ€.
λ¬Έμλ₯Ό κΈ°λ°μΌλ‘
κ·μΉ μ΅μ μ κ·μΉμ΄ μ¬μ©λλμ§ μ¬λΆλ₯Ό λνλ΄λ λΆμΈ μ°Έ/κ±°μ§ κ°μ΄κ±°λ λΆμΈμ΄ λͺ©λ‘μ΄ μλ κ²½μ°μ λμΌνκ² μ 곡νλ λͺ©λ‘ [λΆμΈ, ...]μΌ μ μμΌλ©° λͺ©λ‘μ λλ¨Έμ§ λΆλΆμ λ€μκ³Ό κ°μ΅λλ€. κ²μ¬ λμμ κ²°μ ν κ·μΉμ λν μ΅μ
λ°λΌμ κΈ°λ³Έμ μΌλ‘ κ·μΉμ νμ±ννλ €λ©΄ λ€μκ³Ό κ°μ΄ κ·μΉ μ΅μ νμκ³Ό κ΄λ ¨νμ¬ λ κ°μ§ μ΅μ λ§ μ¬μ©ν μ μμ΅λλ€.
{
"rules": {
"class-name": true,
"some-otherrule": [ true, arg1, arg2, arg3],
...
}
}
λ°λΌμ νμ¬ νμμμλ μΌλΆ νμΌμ λν νΉμ κ·μΉμ νμ±ν/λΉνμ±νν μ μμ΅λλ€. μ€λ₯ κ²μ¬μμ νλμ νμΌμ μ μΈνλ €λ©΄ λͺ¨λ κ·μΉμ λν΄ ν΄λΉ νμΌμ μ μΈν΄μΌ ν©λλ€.
μΌλΆ νμΌ μ μΈλ₯Ό νμ©νλ €λ©΄ κ³ κΈ νμ
λͺ©λ‘ [boolean, ...] μ¬κΈ°μ λΆμΈμ λͺ©λ‘μ΄ μλ κ²½μ°μ λμΌνκ² μ 곡ν©λλ€.
"some-otherrule": [ true, arg1, arg2, arg3],
ν¬ν¨/μ μΈλλ νμΌμ μ μνλ 첫 λ²μ§Έ μΈμκ° λΆμΈ(νμ¬μ κ°μ΄) λλ λ°°μ΄(λλ λ°°μ΄μ λΉν΄ κ°μ²΄κ° λ λͺ νν κΉμ?)μ΄ λ μ μλλ‘ νμ₯λ μ μμ΅λλ€.
λ€μ ꡬ문μ μΌλμ λκ³ μμ΅λλ€.
"some-otherrule": [ [includeGlobPattern, excludeGlobPattern], arg1, arg2, arg3],
μλ₯Ό λ€μ΄
"some-otherrule": [ ["**/*", "**/generated.ts"], arg1, arg2, arg3],
λλ λ°°μ΄ λμ κ°μ²΄λ₯Ό μ¬μ©νλ κ²½μ° follwogin κ΅¬λ¬Έμ΄ ν¨μ¬ λ μ¬μΈ κ²μ
λλ€.
"some-otherrule": [ {exclude: "**/generated.ts"}, arg1, arg2, arg3],
μ¬κΈ°μ include μμ±μ κΈ°λ³Έμ μΌλ‘ λͺ¨λ νμΌλ‘ μ€μ λ©λλ€.
λ¨μν λ€μμ μ¬μ©νμ§ μλ μ΄μ λ 무μμ λκΉ?
/* tslint:disable:class-name */
// your generated file here
μλνμ§ μμ΅λκΉ?
κ·Έκ²μ μ€μ λ‘ μλνκ² λ§λλ λ° μ¬μ©λ μ μμ§λ§ TypeScript μμ±κΈ° μμ μ νΌνκΈ° μν΄(λλ μμ±λ νμΌμ tslint ννΈλ₯Ό μΆκ°νμ¬ μμ± νλ‘μΈμ€μ 볡μ‘μ±μ μΆκ°νκΈ° μν΄) μ΄ κΈ°λ₯ μμ²μ μ μΆνμ΅λλ€.
μμΌλμΉ΄λλ₯Ό μ¬μ©νλ©΄ κ° νμΌμμκ° μλλΌ tslint ꡬμ±μμ νΉμ μ νμ μμ€(main/unitTests/e2eTests)μλ§ νΉμ κ·μΉμ μ μΈμ μΌλ‘ μ μ©νλ λ° λμμ΄ λ μ μμ΅λλ€.
μ΄λ»κ² μκ°νλμ?
νμΌμ μ£Όμμ μΆκ°νμ§ μμΌλ €λ©΄ Lintingμ μν΄ νμΌμ tslint
μ μ λ¬νμ§ λ§μμμ€.
(λΆλΆ) νμΌ μ μΈλ₯Ό λ¬μ±νλ λ°©λ²μ΄ λ κ°μ§ μ΄μ μμ λ λ€λ₯Έ κ³³μ μ΅μ μ μΆκ°νκΈ°μλ λ무 무κ²κ² λκ»΄μ§λλ€.
νμΌμ μ£Όμμ μΆκ°νμ§ μμΌλ €λ©΄ lintingμ μν΄ νμΌμ tslintμ μ λ¬νμ§ λ§μμμ€.
κ·Έκ²μ΄ λ΄κ° ν μΌμ΄μ§λ§ μ΄μ μ μΈλ νμΌμ λν΄ μ΄λ€ κ·μΉλ νμΈλμ§ μμ΅λλ€.
(λΆλΆ) νμΌ μ μΈλ₯Ό λ¬μ±νλ λ°©λ²μ΄ λ κ°μ§ μ΄μ μμ λ λ€λ₯Έ κ³³μ μ΅μ μ μΆκ°νκΈ°μλ λ무 무κ²κ² λκ»΄μ§λλ€.
λ€, κ·Έκ²μ΄ μ κ° λ΅λ³μΌλ‘ μμν κ²μ λλ€.
μ€μ λ‘ μ΄κ²μ΄ ꡬνλλ€λ©΄, ν¬ν¨ λ° μ μΈ ν¨ν΄μ λν μμλ₯Ό μ μν μ μλ€λ©΄ μ 리ν κ²μ λλ€. λ°λΌμ νν°λ§νλ €λ λͺ¨λ κ·μΉμ λμΌν ν¬ν¨/μ μΈ ν¨ν΄μ 볡μ¬νμ¬ λΆμ¬λ£μ νμκ° μμ΅λλ€. κ°μ νμΌλ€... μμ λ₯Ό λ 볡μ‘νκ² λ§λλ κ²μ΄ ν©λ¦¬μ μ΄μ§ μμ μλ μλ€κ³ μκ°νμ§λ§ μΌλμ λμμ΅λλ€.
{
"constants": {
"generatedFilesGlob": "**/generated.ts",
"someOtherConstant": "some other value, that could be reused",
...
},
"rules": {
"class-name": true,
"some-otherrule": [ true, "arg1", "arg2", "arg3"],
"rule-with-exclude": [ {"exclude": "generatedFilesGlob"}, "arg1", "arg2", "arg3"],
...
}
}
κ·Έλ¬λ κ΅¬μ± νμΌμ ꡬ문 λΆμνκΈ°κ° λ μ΄λ €μμ§λλ€. json νμΌ μΈμλ ꡬμ±μ μν js νμΌ μ§μμ λν΄ μκ°νκ² λμμ΅λλ€. μλ₯Ό λ€μ΄:
const generatedFilesGlob = "**/generated.ts";
const allExceptGenerated = {exclude: generatedFilesGlob};
module.exports = {
"rules": {
"class-name": true,
"some-otherrule": [ true, "arg1", "arg2", "arg3"],
"rule-with-exclude": [ allExceptGenerated , "arg1", "arg2", "arg3"],
"another-rule-with-the-same-exclude-pattern": [ allExceptGenerated , "arg1", "arg2", "arg3"],
...
}
}
λͺ¨λκ³Ό ν¨κ» JavaScript νμΌμ μ¬μ©νλ©΄(gulpμ κ°μ) λ λ€λ₯Έ μ΄μ μ΄ μμ΅λλ€. μ£Όμ μ²λ¦¬κ° κ°λ₯νκ³ λ°°μ΄μ λ§μ§λ§ μμ λλ κ°μ²΄μ μμ± λ€μ μ€λ μΌνμ λν΄ κ·Έλ κ² μ격νμ§ μμ΅λλ€.
@atsu85 ν₯λ―Έλ‘μ΄ λ¬Έμ μ§λ§ @myitcvκ° μ§μ tslint.json
νμΌ λͺ©λ‘/κΈλ‘λΈλ₯Ό λμ
νλ κ²μ 꺼립λλ€. λλ TSLintκ° λ¨μν .json
νμΌ μΈμλ ꡬμ±μ μν΄ .js
νμΌμ νμ©ν΄μΌ νλ€λ λ° λμν©λλ€. μ¬μ© μ¬λ‘λ₯Ό ν΄κ²°νλ λ° λμμ΄ λ κ²μ΄λΌκ³ μκ°ν©λλ€. λ κ°μ tslint
λΉλ μμ
(μΌλ° μμ€μ© νλ, μμ±λ μμ€μ© νλ)μ μ€μ νκ³ νλμμ class-name
κ·μΉμ νλ‘κ·Έλλ° λ°©μμΌλ‘ λΉνμ±νν μ μμ΅λλ€. λμΌν tslintConfig.js
νμΌμ μμ΅λλ€.
.js
κ΅¬μ± νμΌ μ§μμ μν΄ #1065 μ μΆ
μΆ©λΆν 곡νν©λλ€. js κ΅¬μ± νμΌλ§ μ¬μ©νλλ‘ μ΄ λ¬Έμ λ₯Ό μ’ λ£νκ² μ΅λλ€.
μ΄ν΄κ° λ μ μλ μ¬μ© μ¬λ‘κ° μμ΅λλ€. μ’μ μ½λ© λ°©λ²μ΄ ν μ€νΈμλ μ μ©λλ―λ‘ λλΆλΆμ Typescript TSLint κ·μΉμ 곡μ νλ €λ ν μ€νΈ νμΌ(*.spec.ts)μ΄ μμ΅λλ€.
κ·Έλ¬λ λ΄ μ½λμ 5κ° μλλ‘ 'λ§λ²μ μ«μ' κ·μΉμ λν΄ κ΅¬μ±λ λͺ κ°μ§ μμλ₯Ό ν
μ€νΈνκ³ μμ΅λλ€.
(Foo.substr(0,5);
κ·Έλ¬λ κ·Έκ²μ΄ constμΈμ§ νμΈνμμμ€
(Foo.substr(0,CONSTANT.FIVE);
λ°λΌμ κ³΅ν΅ νμΌμ ν¬ν¨λ λ΄ constμ λν ν
μ€νΈ μ¬λ‘μλ const FIVE = 5κ° νμ μ€μ λμ΄ μλμ§ νμΈνλ ν
μ€νΈκ° μμ΅λλ€. ν
μ€νΈμμ λ§€μ§ λλ²κ° μ¬μ©λκΈ° λλ¬Έμ expect(CONSTANTS.FIVE).toBe(5);
ν
μ€νΈλ TSLint κ²μ¬μ μ€ν¨ν©λλ€. μ΄ λ°©λ²μΌλ‘ λͺ¨λ μμλ₯Ό ν
μ€νΈνμ§λ μμ§λ§ μ΄λ¬ν μ«μ μ€μ μ νμΈνμ¬ νΉμ ν¬κΈ°λ₯Ό μ μ§ν΄μΌ νλ―λ‘ λ³κ²½λμ§ μλμ§ νμΈνκ³ μΆμ΅λλ€.
λ κ°μ§ λ€λ₯Έ TSLint ꡬμ±μ μ¬μ©ν μ μμ§λ§ λκΈ°νλμ§ μκ±°λ μ κ·μΉμ μΆκ°ν λ μ¬λ¬ μμΉμμ μνν΄μΌ νλ κ²μ νΌνκ³ μΆμ΅λλ€.
μ΄ νΉμ ν μ€νΈμ λν΄ /* tslint:disable :no-magic-numbers*/λ₯Ό μνν μ μμ§λ§ ν μ€νΈ νμΌμ λ€λ₯Έ κ²½μ°μλ μμΈκ° νμν μ μμ΅λλ€. κ° *.spec.tsλ₯Ό μ λ°μ΄νΈνλ λμ κ·μΉμ λν μ μ ν¨ν΄μ΄ μλν©λκΉ?
@Chowarmaanκ³Ό λΉμ·ν μ¬μ© μ¬λ‘κ° μμ΅λλ€.
*.test.ts
μ κ°μ΄ κ°λ° μ’
μμ±μ μ¬μ©νλ ν
μ€νΈ νμΌ enzyme
μμ΅λλ€.
tslint.json
no-implicit-dependencies
κ·μΉμ΄ νμ±νλμ΄ μκ³ *.test.ts
λν΄μλ§ μ΄ κ·μΉμ λΉνμ±ννκ³ μΆμ΅λλ€. ν΄λΉ ν
μ€νΈ νμΌμ΄ λͺ¨λ κ°μ ν΄λμ μλ κ²μ μλλ―λ‘ μ§κΈ λΉμ₯ λ€μμ λ£μ΄μΌ ν©λλ€.
/* tslint:disable:no-implicit-dependencies */
μ±κ°μ κ° ν μ€νΈ νμΌμ μμ λΆλΆμμ
μ΄κ²μ ν μ€νΈ νμΌμ 맨 μμ λΉνμ±νλ₯Ό μΆκ°ν μ μλ @RomanGotsiy μ λ§μ°¬κ°μ§λ‘ λ΄κ° κ²ͺκ³ μλ μ μ¬ν λ¬Έμ μ΄μ§λ§ κ° νμΌμ λν΄ λ²κ±°λ‘μμ§λλ€. μ μΈ νμΌμ νΉμ ν¨ν΄ νμΌ(ν μ€νΈ νμΌ, *.spec.ts)μ λν κ·μΉμ μ μΈν μ μκ³ νμν λ λ λ§μ κ·μΉμ νμ±ννκ³ ν μ€νΈλ₯Ό νμ©ν μ μλ νλμ κΉ¨λν κ΅¬μ± νμΌμ΄ μμΌλ―λ‘ λμμ΄ λ©λλ€. κ·Έλ€μ μ¬μ©νκΈ° μν΄. κ·Έλ¬λ©΄ μ μΈ νμΌ λͺ©λ‘μ κ° κ·μΉμ νμΌ μ μΈλ₯Ό μΆκ°νλ λμ λΉνμ±ννλ €λ κ·μΉλ§ ν¬ν¨λ μ μμ΅λκΉ?
μ΄κ². 100%. ν
μ€νΈ μ’
μμ±μ΄ μμ
곡κ°μ λμ΄λμ΄ μλ monorepoμ μ΄ λ¬Έμ κ° μμΌλ―λ‘ tslintλ no-implicit-dependencies
λν΄ μΈκ³ μμ΅λλ€. IDE λ¦°ν
μ΄ κ³μ μλνλ €λ©΄ λ¨μΌ κ΅¬μ± νμΌλ‘ μνν΄μΌ ν©λλ€.
μ΄ λ¬Έμ λ #3447κ³Όλ κ΄λ ¨μ΄ μλ€κ³ μκ°ν©λλ€.
μ΄ μ€λλ μ€λ λμλ μΆκ°νκ² μ΅λλ€. λ΄ Angular νλ‘μ νΈμμ NgRx μ μ₯μλ₯Ό ꡬννλ μ€μ λλ€. ν¨μμ λν const μ°Έμ‘°λ₯Ό λ΄λ³΄λΌ λ AOT λΉλκ° μ μκ² μ리λ₯Ό μ§λ¦ λλ€...
export const reducer = ( state = initialState, action: CurrentAction): CurrentState => {...}
Function expressions are not supported in decorators in 'reducers'
μ€λ₯κ° λ°μν©λλ€. λ¬Έμ λ λ¦°νΈ κ·μΉμΌλ‘ μΈν΄ λ°μν©λλ€. νλ‘μ νΈ μ 체μμ only-arrow-functions
κ·μΉμ ꡬ체μ μΌλ‘ νμ±ννμ΅λλ€... μ΄ νΉμ κ·μΉμ λν μλ‘ *.reducer.ts
νμΌμ μ μΈνλλ‘ μ μΈμ ν¨ν΄ μΌμΉλ₯Ό μΆκ°νλ κ²μ΄ μ’μ§λ§ λ€λ₯Έ λͺ¨λ νμΌμ λν΄ κ·Έλλ‘ μ μ§λ©λλ€.
μλ κ·Έλλ‘ λͺ¨λ κ°μκΈ° νμΌμ νμΌ λ§¨ μμ μ΄ μ€μ μΆκ°νλ κ²μ λ²κ±°λ‘μ΅λλ€. λ μ’μ λ°©λ²μ΄ μμ κ² κ°μ΅λλ€.
μ΄κ²λ λ€ν¬λ‘λ²ν. Vue νλ‘μ νΈμ tslint-microsoft-contribλ₯Ό μΆκ°νκ³ .vue νμΌμ κ·μΉ ννμ μΆκ°νλ €κ³ ν©λλ€. μ΄κ²μ κ·μΉ μμ±μκ° μνλ κ²½μ° ν΄λΉ λ²κ·Έλ₯Ό μμ νκΈ° μ μ μ΄μ κ°μ λ¬Έμ μ λν μ μ©ν ν΄κ²° λ°©λ²μ΄ λ μ μμ΅λλ€. λ΄κ° μ°λ λͺ¨λ Vue νμΌμ λ§μ κ·μΉμ λΉνμ±ννλ μ£Όμμ μΆκ°νλ κ²μ μ€μ λ‘ λ²κ±°λ‘μ΅λλ€. λν UI μ½λμμ μ½κ° λ μ격νκ±°λ κΈ°λ³Έ λ΄λ³΄λ΄κΈ° μ¬μ©κ³Ό κ°μ νλ μμν¬ κ΄μ©κ΅¬λ₯Ό μ²λ¦¬νλ κ²μ΄ μ’μ΅λλ€.
κ°μ₯ μ μ©ν λκΈ
@Chowarmaanκ³Ό λΉμ·ν μ¬μ© μ¬λ‘κ° μμ΅λλ€.
*.test.ts
μ κ°μ΄ κ°λ° μ’ μμ±μ μ¬μ©νλ ν μ€νΈ νμΌenzyme
μμ΅λλ€.tslint.json
no-implicit-dependencies
κ·μΉμ΄ νμ±νλμ΄ μκ³*.test.ts
λν΄μλ§ μ΄ κ·μΉμ λΉνμ±ννκ³ μΆμ΅λλ€. ν΄λΉ ν μ€νΈ νμΌμ΄ λͺ¨λ κ°μ ν΄λμ μλ κ²μ μλλ―λ‘ μ§κΈ λΉμ₯ λ€μμ λ£μ΄μΌ ν©λλ€.μ±κ°μ κ° ν μ€νΈ νμΌμ μμ λΆλΆμμ