我想一个实用程序,我可以直接使用IsStrictlyAny<T>,它会解决的类型true,如果T是完全any和对false否则类型。我怎样才能做到这一点?
我的第一个想法:
type IsStrictlyAny<T> = any extends T ? true : false;
Run Code Online (Sandbox Code Playgroud)
结果:
IsStrictlyAny<any>:(true好!)IsStrictlyAny<unknown>:(true不好!-我想要false)IsStrictlyAny<string>:(boolean不好!-我想要false)我正在尝试编写ts-optchain. 功能将尝试返回具有拼接更改的根对象的副本。这样原件不会以任何方式改变或修改。然而,对于尚未修改的对象区域,它们作为引用(通过Object.assign(...))复制到浅复制操作中。
我试图验证的测试如下:
const example = { a: { b: { c: { d: 5 } } } };
const out = osc(example).a.b.c.d(6);
expect(out).to.be.deep.eq({ a: { b: { c: { d: 6 } } } });
Run Code Online (Sandbox Code Playgroud)
... 其中osc(可选设置链)是我对 mimmicopt-chain的oc功能所做的功能。
我期待结果有点类似于 Object.assign({}, example, {a: Object.assign({}, example.a, {b: Object.assign({}, example.a.b, {c: Object.assign({}, example.a.b.c, {d: 6})})})});
上述方法编写、阅读和维护都很痛苦。因此,使这个功能的推理。
我的尝试如下:
// ----- Types -----
// Generic type "R" -> The returned root object type …Run Code Online (Sandbox Code Playgroud) 是否可以any使用打字稿条件语句检查确切的类型?
type IsAny<T> = T extends any ? true : never
type A = IsAny<any> // true
type B = IsAny<number> // never
type C = IsAny<unknown> // never
type D = IsAny<never> // never
Run Code Online (Sandbox Code Playgroud) 我尝试应用此解决方案来禁止调用第二类型等于 的泛型函数any。
以下构造一直有效,直到明确指定第一个通用参数:
declare function f<V = any, A extends ISmth = ISmth>(a: IfAny<A, never, A>): V;
Run Code Online (Sandbox Code Playgroud)
如果我需要V成为第一个参数并且是可选的(它是返回类型并且无法推断 - 它应该明确指定或可以是任何),我该如何修复代码?
我尝试更改默认值,但它会破坏任何具有显式第一类型的调用:
declare function g<V = any, A extends ISmth = any>(a: IfAny<A, never, A>): V;
Run Code Online (Sandbox Code Playgroud)
interface ISmth { x: number; }
type IfAny<T, Y, N> = 0 extends (1 & T) ? Y : N;
declare function f<V = any, A extends ISmth = ISmth>(a: IfAny<A, never, A>): V;
declare function g<V = …Run Code Online (Sandbox Code Playgroud)