타사 js 라이브러리에 대한 TypeScript 정의 파일을 작성 중입니다. 방법 중 하나는 옵션 개체를 허용하고 옵션 개체의 속성 중 하나가 목록에서 문자열을 받아 : "collapse"
, "expand"
, "end-expand"
,와 "none"
.
옵션 객체에 대한 인터페이스가 있습니다.
interface IOptions {
indent_size?: number;
indent_char?: string;
brace_style?: // "collapse" | "expand" | "end-expand" | "none"
}
인터페이스가이를 강제 할 수 있으므로 속성을 IOptions
가진 개체 를 포함 brace_style
하면 허용 가능한 목록에있는 문자열 만 허용합니까?
답변
이것은 버전 1.8에서 “문자열 리터럴 유형”으로 릴리스되었습니다.
페이지의 예 :
interface AnimationOptions {
deltaX: number;
deltaY: number;
easing: "ease-in" | "ease-out" | "ease-in-out";
}
답변
이 시도
export type ReadingTypes = 'some'|'variants'|'of'|'strings';
export interface IReadings {
param:ReadingTypes
}
답변
아마도 정확히 원하는 것이 아니지만 Enum
s는 완벽한 솔루션처럼 보입니다.
enum BraceStyle {Collapse, Expand, EndExpand, None}
interface IOptions {
indent_size?: number;
indent_char?: string;
brace_style?: BraceStyle
}
그러나 열거 형은 숫자를 기반으로합니다. 예를 들어 런타임 동안 실제 값은 BraceStyle.Collapse
0이됩니다. 그러나 객체로 컴파일되기 때문에 다른 비 유형 스크립트 스크립트와 함께 사용할 수 있습니다. 다음은 BraceStyle
컴파일 및 실행 방법 입니다.
{
0: "Collapse",
1: "Expand",
2: "EndExpand",
3: "None",
Collapse: 0,
Expand: 1,
EndExpand: 2,
None: 3
}
답변
TS는 문자열 리터럴 유형 이라고하는 특정 문자열 값에 대한 타이핑을 제공합니다 .
사용 방법의 예는 다음과 같습니다.
type style = "collapse" | "expand" | "end-expand" | "none";
interface IOptions {
indent_size?: number;
indent_char?: string;
brace_style1?: "collapse" | "expand" | "end-expand" | "none";
brace_style2?: style;
}
// Ok
let obj1: IOptions = {brace_style1: 'collapse'};
// Compile time error:
// Type '"collapsessss"' is not assignable to type '"collapse" | "expand" | "end-expand" | "none" | undefined'.
let obj2: IOptions = {brace_style1: 'collapsessss'};
답변
function keysOf<T>(obj: T, key: keyof T) { return obj[key]; }
interface SomeInterface {
a: string;
}
const instance: SomeInterface = { a: 'some value'};
let value = keysOf<SomeInterface>(instance, 'b'); // invalid
value = keysOf<SomeInterface>(instance, 'a'); // valid
답변
TypeScript 2.4부터는 문자열 열거 형을 사용할 수 있습니다
이 방법은 동일한 하드 코딩 된 문자열을 둘 이상의 위치에 둘 필요가 없기 때문에이 방법을 선호합니다.
값이 문자열 인 열거 형을 만들 수 있습니다
export enum VISIBILITY {
PUBLISH = "publish",
DRAFT = "draft"
}
이 열거 형은 인터페이스 또는 클래스에서 유형으로 사용될 수 있습니다.
export interface UserOptions {
visibility: VISIBILITY
}