Default Generic Arguments
for typehero
the problem link
just paste some code and brief description here, if wanna see the full content, please click the link above.
A lot of the same rules apply in types that apply to function argument defaults. For example, you can’t have a required argument following a default argument.
case:
type ApiRequest = unknown
type TSConfig = unknown
import { Expect, Equal } from 'type-testing';
type test_ApiRequest_explicitPost = Expect<
Equal<ApiRequest<string, 'POST'>, { data: string; method: 'POST' }>
>;
type test_ApiRequest_implicitGet = Expect<
Equal<ApiRequest<number>, { data: number; method: 'GET' }>
>;
type test_TSConfig_default = Expect<Equal<TSConfig, { strict: true }>>;
type test_TSConfig_true = Expect<Equal<TSConfig<{ strict: true }>, { strict: true }>>;
type test_TSConfig_false = Expect<Equal<TSConfig<{ strict: false }>, { strict: false }>>;
type test_TSConfig_boolean = Expect<Equal<TSConfig<{ strict: boolean }>, { strict: boolean }>>;
分析:
- 对于
ApiRequest这个类型从给出的case当中可以看出,接收两个泛型参数,对应的对象
{
data:泛型;
method:泛型;
}
但同时要满足Equal<ApiRequest<number>, { data: number; method: 'GET' }>说明第二个泛型接受一个默认参数'GET'
所以最终答案为:
type ApiRequest<T,U = 'GET'> = {
data: T;
method:U;
}
- 对于
TSConfig看得出它接收什么返回什么即可;
type TSConfig<T = { strict: true }> = T
虽然综上的类型可以通过case并且提交成功,但是在实际的场景下我们还需要加上类型限制;
例如对于ApiRequest<T,U='GET'>,U给了默认的’GET’,例如我们需要限制U的类型只能是’GET’或者’POST’,这样才能保证类型的安全性;
type ApiRequest<T,U extends 'GET'|'POST' = 'GET'> = {
data: T;
method:U;
}
这样即使 类似于
const a:ApiRequest<number,'a'> = {
data:1,
method:'a'
} // 这样的类型也是不允许的
对于TSConfig同理
type TSConfig<T extends {strict:boolean} = { strict: true }> = T
评论
加载中…
使用 GitHub 登录后即可留言。
使用 GitHub 登录评论功能尚未配置。
还没有评论,来做第一个吧。
在 GitHub 上查看讨论 →