typescript 의 infer 키워드 사용 을 깊이 이해 합 니 다.
5291 단어 typescriptinfer 키워드
infer
typescript 2.8 에 추 가 된 키워드 입 니 다.
infer 는 extends 조건 형식의 자구 에서 실제 분기 에서 이 추정 유형 변 수 를 참조 하여 추정 할 유형 을 추정 할 수 있 습 니 다.
예 를 들 어 infer 로 함수 의 반환 값 형식 을 추정 합 니 다.
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
type fn = () => number
type fnReturnType = ReturnType<fn> // number
이 예 에서T extends U ? X:Y 의 형식 은 조건 유형 이다.
infer R 은 추정 되 는 반환 값 형식 을 대표 합 니 다.T 가 함수(...args:any[])=>infer R 이면 함수 의 반환 값 R 을 되 돌려 줍 니 다.그렇지 않 으 면 any 를 되 돌려 줍 니 다.
사례:깊 은 이해
역 해 Promise
// promise
type PromiseResType<T> = T extends Promise<infer R> ? R : T
//
async function strPromise() {
return 'string promise'
}
interface Person {
name: string;
age: number;
}
async function personPromise() {
return {
name: 'p',
age: 12
} as Person
}
type StrPromise = ReturnType<typeof strPromise> // Promise<string>
//
type StrPromiseRes = PromiseResType<StrPromise> // str
type PersonPromise = ReturnType<typeof personPromise> // Promise<Person>
//
type PersonPromiseRes = PromiseResType<PersonPromise> // Person
역 해 함수 입 참 형식
type Fn<A extends any[]> = (...args: A) => any
type FnArgs<T> = T extends Fn<infer A> ? A : any
function strFn (name: string) {
}
type StrFn = FnArgs<typeof strFn> // [string]
[string,number]->string|number
type ElementOf<T> = T extends Array<infer E> ? E : never
type TTuple = [string, number];
type ToUnion = ElementOf<ATuple>; // string | number
new 연산 자
//
type ConstructorParameters<T extends new (...args: any[]) => any> = T extends new (...args: infer P) => any ? P : never;
//
type InstanceType<T extends new (...args: any[]) => any> = T extends new (...args: any[]) => infer R ? R : any;
class TestClass {
constructor(
public name: string,
public string: number
) {}
}
type Params = ConstructorParameters<typeof TestClass>; // [string, numbder]
type Instance = InstanceType<typeof TestClass>; // TestClass
react - reducer
//
function useReducer<R extends Reducer<any, any>, I>(
reducer: R,
// ReducerState
initializerArg: I & ReducerState<R>,
initializer: (arg: I & ReducerState<R>) => ReducerState<R>
): [ReducerState<R>, Dispatch<ReducerAction<R>>];
// infer
type ReducerState<R extends Reducer<any, any>> = R extends Reducer<infer S, any>
? S
: never;
// Reducer
type Reducer<S, A> = (prevState: S, action: A) => S;
// reducer
const reducer = (x: number) => x + 1;
const [state, dispatch] = useReducer(reducer, '');
// Argument of type "" is not assignable to parameter of type 'number'.
vue3 - ref
export interface Ref<T = any> {
[isRefSymbol]: true
value: T
}
export function ref<T>(value: T): T extends Ref ? T : Ref<UnwrapRef<T>>
export type UnwrapRef<T> = {
cRef: T extends ComputedRef<infer V> ? UnwrapRef<V> : T
ref: T extends Ref<infer V> ? UnwrapRef<V> : T
array: T
object: { [K in keyof T]: UnwrapRef<T[K]> }
}[T extends ComputedRef<any>
? 'cRef'
: T extends Array<any>
? 'array'
: T extends Ref | Function | CollectionTypes | BaseTypes
? 'ref' // bail out on types that shouldn't be unwrapped
: T extends object ? 'object' : 'ref']
//
const count = ref({
foo: ref('1'),
bar: ref(2)
})
//
const count: Ref<{
foo: string;
bar: number;
}>
const count = ref(2) // Ref<number>
const count = ref(ref(2)) // Ref<number>
레 퍼 런 스infer
TypeScript 의 infer 키 워드 를 이해 합 니 다.
Vue 3 는 유 우 계 학 TypeScript 의 Ref 유형 을 따라 0 에서 이 루어 집 니 다.
typescript 의 infer 키 워드 를 깊이 이해 하 는 데 사용 되 는 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 typescript infer 키 워드 는 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Typescript 팁: 브랜드 유형을 사용하면 더 안전한 기능을 사용할 수 있습니다.다음과 같은 함수가 있다고 상상해 보십시오. 페이지 번호는 음수가 될 수 없기 때문에 분명히 잘못된 것입니다. 간단한 해결책은 다음과 같은 줄을 추가하는 것입니다. 그러나 음수로 함수를 호출하려고 할 때 유형 오류가...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.