(typescript) object를 처리하는 인덱스자가 String 값을 사용할 수 없는 오류
13197 단어 TypeScript
문제: String 변수를 Object 색인으로 사용할 수 없습니다.
함수 목록과 같은 Object에서 String 전달 방법명으로 함수를 동적으로 호출하고 아래 처리된 곳을 적어서 Typescript의 Error가 되었습니다.
Demo.ts
const dateFormatFunctionList = {
Y: function(date:Date):String{ return date.getFullYear().toString()},
y: function(date:Date):String{ return (date.getFullYear().toString()).slice(2) },
}
function getFormattedDate(date:Date, format:String):String{
//javascriptの動的なメソッド呼び出し
return dateFormatFunctionList[format](date);
}
getFormattedDate(new Date(), 'Y'); //2019
getFormattedDate(new Date(), 'y'); //19
error.txt型 'String' はインデックスの型として使用できません。ts(2538)
원인: typescript에서 Object 인덱스는 String을 사용할 수 없습니다.
typescript는 대상의 색인자로서 String을 사용할 때 상기 오류가 발생할 것 같습니다.
(javascript 표준에서 브래킷 표현법이라고 불리는 방법을 통해 키 괄호 ([]) 에 문자열을 전달하는 방법으로 접근할 수 있습니다.그러나 원래 문자열에서 객체에 동적으로 액세스할 때 연상 배열(Map)을 사용할 수 있습니다.
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Property_Accessors
해결 방법 1: 오류를 피하기 위해 소문자string형을 인덱스로 사용합니다.
대상의 인덱스는 기본체 형식
String
을 전달하는 데 오류가 발생하지만, 모든 소문자string
형식을 인덱스로 전달하더라도 typescript는 오류가 없습니다.https://fedidat.com/550-typescript-string-index/
따라서 String에서 전달된 값으로 toString()을 진행하여 원어가 아닌 소문자
string
형으로 변환하여 더 이상 오류가 발생하지 않습니다.(또한 dateFormatFunctionList
을any형으로 전환함으로써const의 자동형 추리 부대형을 해제하였다.)Demo.ts
function getFormattedDate(date:Date, format:String):String{
//javascriptの動的なメソッド呼び出し
return (dateFormatFunctionList as any)[(format.toString())](date);
}
이렇게 하면 잘못이 없다.해결 방법 2:'string형 임의의 키를 가진 대상'이라는 인터페이스를 자체 제작한다.
이 문제는 원래'기본적인 대상형에 비해 색인자는 String을 사용할 수 없다'는 문제이기 때문에string형의 임의의 키 대상인interface를 통해 해결할 수 있습니다.
다음과 같이 IndexableInterface를 생성합니다.
IndexableInterface.ts
export default interface IndexableInterface {
[
key: string
]: any;
}
액세스할 객체에 이 인터페이스를 지정합니다.Demo.ts
import IndexableInterface from './IndexableInterface'
const dateFormatFunctionList = {
Y: function(date:Date):String{ return date.getFullYear().toString()},
y: function(date:Date):String{ return (date.getFullYear().toString()).slice(2) },
}
function getFormattedDate(date:Date, format:string):String{
//javascriptの動的なメソッド呼び出し
return (dateFormatFunctionList as IndexableInterface)[format](date);
}
getFormattedDate(new Date(), 'Y'); //2019
getFormattedDate(new Date(), 'y'); //19
이제 String형의format을 소문자string형으로 자동으로 변환할 수 있습니다. 더 이상 오류가 발생하지 않습니다.기타: 인덱스 인터페이스의 키에 기본체 문자열 형식을 지정할 수 없습니다
IndexableInterface 키의 경우 기본체 String으로 변환하려고 하면 다음 오류가 발생할 수 없습니다.
error.txt
インデックス シグネチャのパラメーターの型は 'string' または 'number' でなければなりません。ts(1023)
그러니까전제 조건
tsconfig.json
{
"compilerOptions": {
"outDir": "./built/",
"sourceMap": true,
"strict": true,
"noImplicitReturns": true,
"noImplicitAny": true,
"module": "es2015",
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"moduleResolution": "node",
"target": "es5",
"lib": [
"es2016",
"dom"
]
},
"include": [
"src/ts/**/*"
]
}
2019/07/31 추기props의 type에 소문자string형을 지정하면 오류가 발생합니다.
'string' only refers to a type, but is being used as a value here.Vetur(2693)
string은 typescript 형식입니다.
vue에 전달되는props는'props명칭을 키로 설정하고 이 설정object를value로 설정하는object'의 형식인 것 같습니다. 형식을 키'type'의 value로 전달하기 때문에string은 typescript의 type일 뿐이므로 설정할 수 없습니다.
문자열은javascript의 형식 대상입니다.
이에 비해 String은 전역 형식의 대상이기 때문에 object의value로 설정할 수 있기 때문에 상기 상황에서 오류가 발생하지 않습니다.이런 상황에서props는'문자열형 데이터로 변환할 수 있는 데이터(문자열 문자 등)'의 유형으로 유형 제한을 할 수 있습니다.
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String
이 사이트도string과 String의 차이를 상세하게 기재하였으니 참고하겠습니다.
https://saku.io/difference-string-types-in-typescript/
그러니까
여기서 마치겠습니다.
Reference
이 문제에 관하여((typescript) object를 처리하는 인덱스자가 String 값을 사용할 수 없는 오류), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ttn_tt/items/9fdd8e8c58d795d662cf텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)